编写两个线程,顺序输出自然顺序:1,2,3,4,...,99,100
并发编程。请编写两个线程,线程1顺序输出1,3,5,...,99等奇数,每个数一行。线程2顺序输出2,4,6,...,100等偶数,每个数一行。最终的结果要求是输出为自然顺序:1,2,3,4,...,99,100。
方法一:
创建线程类RunnableDemo1.Java
public class RunnableDemo1 implements Runnable{ private Thread t; private String threadName; private Object curlock; RunnableDemo1( String name,Object lock) { super(); threadName = name; curlock = lock; } public void run() { synchronized (curlock) { try { for (int i = 1; i < 100; ) { System.out.println(i); i = i + 2; curlock.notifyAll(); curlock.wait(); } } catch (InterruptedException e) { System.out.println("Thread " + threadName + " interrupted."); } } } public void start () { // System.out.println("Starting " + threadName ); if (t == null) { t = new Thread (this, threadName); t.start (); } } public void interrupt () { if (t == null) { t = new Thread (this, threadName); t.interrupt (); } } }
创建线程类RunnableDemo2.Java
public class RunnableDemo2 implements Runnable{ private Thread t; private String threadName; private Object curlock ; RunnableDemo2( String name,Object lock) { super(); threadName = name; curlock = lock; } public void run() { synchronized (curlock) { try { for(int i = 2; i <= 100; ) { System.out.println(i); i=i+2; curlock.notifyAll(); curlock.wait(); } }catch (InterruptedException e) { System.out.println("Thread " + threadName + " interrupted."); } } } public void start () { if (t == null) { t = new Thread (this, threadName); t.start (); } } public void interrupt () { if (t == null) { t = new Thread (this, threadName); t.interrupt (); } } }
测试类代码:
public class Test { public static void main(String args[]) throws Exception{ final Object lock = new Object(); RunnableDemo1 R1 = new RunnableDemo1( "Thread-1",lock); R1.start(); Thread.sleep(100); RunnableDemo2 R2 = new RunnableDemo2( "Thread-2",lock); R2.start(); R1.interrupt(); R2.interrupt(); } }
方法二:
public class ThreadTest implements Runnable{ int i = 1; public void run() { while (true) { /*ThreadTest,因为使用的是implements方式。若使用继承Thread类的方式,慎用this*/ synchronized (this) { /*唤醒另外一个线程,注意是this的方法,而不是Thread*/ notify(); try { /*使其休眠100毫秒,放大线程差异*/ Thread.currentThread(); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } if (i <= 100) { System.out.println(i); i++; try { /*放弃资源,等待*/ wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
测试方法如下:
public static void main(String[] args) { ThreadTest t = new ThreadTest(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); t2.start(); }