学习Java,为什么不';我不能得到一些线的重叠吗?

学习Java,为什么不';我不能得到一些线的重叠吗?,java,multithreading,Java,Multithreading,我尝试了以下代码: /* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; public class Main { static int i = 0; public static void main(String[] args) { new Thread(t1).start(

我尝试了以下代码:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;


    public class Main {
        static int i = 0;

    public static void main(String[] args) {

        new Thread(t1).start();
        new Thread(t2).start();
        new Thread(t3).start();
        new Thread(t4).start();
        new Thread(t5).start();
        new Thread(t6).start();
    }

    private static void countMe(String name){
        i++;
        System.out.println("Current Counter is: " + i + ", updated by: " + name);
    }

    private static Runnable t1 = new Runnable() {
        public void run() {
            try{
                for(int i=0; i<2; i++){
                    countMe("t1");
                }
            } catch (Exception e){}

        }
    };

    private static Runnable t2 = new Runnable() {
        public void run() {
            try{
                for(int i=0; i<2; i++){
                    countMe("t2");
                }
            } catch (Exception e){}
       }
    };
        private static Runnable t3 = new Runnable() {
        public void run() {
            try{
                for(int i=0; i<2; i++){
                    countMe("t3");
                }
            } catch (Exception e){}
       }
    };
        private static Runnable t4 = new Runnable() {
        public void run() {
            try{
                for(int i=0; i<2; i++){
                    countMe("t4");
                }
            } catch (Exception e){}
       }
    };
        private static Runnable t5 = new Runnable() {
        public void run() {
            try{
                for(int i=0; i<2; i++){
                    countMe("t5");
                }
            } catch (Exception e){}
       }
    };
        private static Runnable t6 = new Runnable() {
        public void run() {
            try{
                for(int i=0; i<2; i++){
                    countMe("t6");
                }
            } catch (Exception e){}
       }
    };
} 
/*打包任何内容;//不要放置包名*/
导入java.util.*;
导入java.lang.*;
导入java.io.*;
公共班机{
静态int i=0;
公共静态void main(字符串[]args){
新线程(t1.start();
新线程(t2.start();
新线程(t3).start();
新线程(t4).start();
新螺纹(t5).start();
新螺纹(t6).start();
}
私有静态void countMe(字符串名称){
i++;
System.out.println(“当前计数器为:“+i+”,更新为:“+name”);
}
私有静态Runnable t1=new Runnable(){
公开募捐{
试一试{

对于(int i=0;i线程需要时间启动),它们可以占用毫秒或几百微秒。如果这听起来不太长,那么考虑CPU在那个时间可以执行一百万个指令。也就是说,在下一个线程有机会启动之前,您的循环结束。

一个简单的方法是A)有一个更长的循环,比如10+,b)添加一个延迟,比如Thread.sleep(1000);你可以看到线程同时运行


我还建议您使用AtomicInteger而不是
int
,因为
I++
不是线程安全的。

线程创建是昂贵的。可能发生的情况是,当您启动线程2时,线程1已经完成。当线程3开始执行任务时,线程2已经完成。依此类推

在线程函数的开头插入一个六方函数并查看它们(甚至可能丢失一些
i
增量,因为
i++
不能保证是原子的)


如果这还不足以可靠地触发竞争,那么让线程做更多的工作。

线程可能太短。要么让循环变长,要么在调用
countMe()
之前在循环中放入一个
Thread.yield()。另一方面,您可以通过创建一个实现
Runnable
并将名称(
“t1”
“t2”
等)作为构造函数参数的命名类来改善代码。将
CyclicBarrier
添加到代码中。Cooountme()是围绕printf库调用的少量代码,然后进行API调用以在内部锁中将数据输出到stdout。除了序列化行为之外,您几乎看不到任何东西。即使如此,偏向锁定将使一个线程优于另一个线程。可以使用-XX:-UseBiasedLockingGood ans禁用热点上的偏向锁定是的,但在我看来,OP是在积极尝试让它成为一场比赛。