Java 线程同步执行(顺序执行)
关于线程,有两种实现方法, 一种是通过继承Runnable接口,另外一种通过扩展Thread类,两者的具体差别,可参考我找的这篇文章 http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html 。本主主要是讲 线程的同步执行问题。。
如果程序是通过扩展Thread类的,网上的资料说可以通过 join()函数实现,但本人亲测,此法无法通过、程序如下:
public class test1 extends Thread { public void run() { synchronized (this) { for(int i = 0; i < 6;i++) { System.out.println(Thread.currentThread().getName()+" 1"); System.out.println(Thread.currentThread().getName()+" 2"); System.out.println(Thread.currentThread().getName()+" 3"); } } } public static void main(String arg0[]) throws InterruptedException { test1 test1 = new test1(); Thread thread1 = new Thread(test1,"test1"); Thread thread2 = new Thread(test1,"test2"); thread1.start(); thread2.start(); thread1.join(); thread2.join(); } }
可能的运行结果:
test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3
由此可见,线程的执行结果并非我们所需要的。因此,只能另寻途径。
线程的另外一种实现方法是通过实现Runnable接口,程序如下:
public class test1 implements Runnable { public void run() { synchronized (this) { for(int i = 0; i < 6;i++) { System.out.println(Thread.currentThread().getName()+" 1"); System.out.println(Thread.currentThread().getName()+" 2"); System.out.println(Thread.currentThread().getName()+" 3"); } } } public static void main(String arg0[]) throws InterruptedException { test1 test1 = new test1(); Thread thread1 = new Thread(test1,"test1"); Thread thread2 = new Thread(test1,"test2"); thread1.start(); thread2.start(); } }
多次执行程序,并未出现异常:
test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test1 1 test1 2 test1 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3 test2 1 test2 2 test2 3