Java实现多线程轮流打印1 - 100的数字操作

  

首先打印1 - 100数字如果用一个单线程实现那么只要一个为循环即可,那么如果要用两个线程打印出来呢?(一个线程打印奇数,一个线程打印偶数)于是大家会想到可以通过加锁实现,但是这样的效率是不是不高?这里我用一个变量来控制两个线程的输出

        公开课ThreadTest {   挥发性int国旗=0;   公共空间runThread()抛出InterruptedException {   线程t1=新线程(新Thread1 ());   线程t2=新线程(新Thread2 ());   t1.start ();   t2.start ();   }   公共类Thread1实现Runnable {      公共空间run () {   int i=0;   而(i<=99) {   如果(标志==0)   {   System.out.println (t1=+我+ "国旗=" +标志);   我+=2;   标志=1;   }   }   }   }      公共类Thread2实现Runnable {      公共空间run () {   int i=1;   而(i<=99) {   如果(标志==1)   {   System.out.println (t2=+我+ "国旗=" +标志);   我+=2;   国旗=0;   }   }   }      }   }      

那么如果要实现三个线程轮流打印1 - 100的数字呢?是不是也可以用上面的方法实现呢?代码如下

        公开课ThreadTest {   私人int i=0;   thread2,私人线程thread1 thread3;   私人int国旗=0;   公共空间runThread()抛出InterruptedException {   thread1=新线程(新thread1 ());   thread2=新线程(新thread2 ());   新thread3 thread3=新线程(());   thread1.start ();   thread2.start ();   thread3.start ();   }   公共类Thread1实现Runnable {      公共空间run () {      而(i<=100) {   如果(标志==0){   System.out.println (" t1=" + i);   我+ +;   标志=1;   }   }   }   }      公共类Thread2实现Runnable {      公共空间run () {      而(i<=100) {   如果(标志==1){   System.out.println (" t2=" + i);   我+ +;   国旗=2;   }   }   }   }      公共类Thread3实现Runnable {      公共空间run () {      而(i<=100) {   如果(标志==2){   System.out.println (" t3=" + i);   我+ +;   国旗=0;   }   }   }      }   }      

运行结果

  

癑ava实现多线程轮流打印1

  

发现三个线程只打印了一次就停止不输出了,是什么原因呢?

  

可以用jdk自带的jstack来看看线程的状态,在windows系统中可以打开cmd然后进入jdk所在目录,然后执行Jsp,能查看到各线程id,然后执行jstack - f pid就可以看的状态了

  

癑ava实现多线程轮流打印1

  

<强>可以看到几个线程状态是封锁,就是阻塞了,什么原因呢?

  

尴尬发现国旗变量和我变量前面忘记加波动,导致国旗和我被线程读取修改时,其他线程不可见,所以才导致上面的问题出现。

  

在JVM中每个线程读取变量到缓存中时相互都是不可见的,也就是java五大内存区中的程序计数器区域对于每个线程都是独立的不共享的,只有堆内存区和方法区是对所有线程都是共享的。

  

当线程1读取了国旗和我的值,并对其进行修改的时候,线程2并发运行,并不知道旗和我值已经改变,导致多线程数据不一致的情况,所以加了波动后,当线程读取变量进行修改后会“通”知其它线程这个值已经进行了修改。

        进口java.util.concurrent.atomic.AtomicInteger;   公开课ThreadTest {   私人波动int i=0;   thread2,私人线程thread1 thread3;   私人波动int国旗=0;   公共空间runThread()抛出InterruptedException {   thread1=新线程(新thread1 ());   thread2=新线程(新thread2 ());   新thread3 thread3=新线程(());   thread1.start ();   thread2.start ();   thread3.start ();   }   公共类Thread1实现Runnable {      公共空间run () {   而(i<100) {   如果(标志==0){   System.out.println (" t1=" + i);   我+ +;   标志=1;   }   }   }      }      公共类Thread2实现Runnable {      公共空间run () {      而(i<100) {   如果(标志==1){   System.out.println (" t2=" + i);   我+ +;   国旗=2;   }   }   }      }      公共类Thread3实现Runnable {      公共空间run () {      而(i

Java实现多线程轮流打印1 - 100的数字操作