两个线程A和B,任务都是打印当前时间,要求编码实现:线程A和B同时启动后,以先A后B的方式任务交叉执行10次。

来源:互联网 发布:tensorflow分布式搭建 编辑:程序博客网 时间:2024/03/29 16:45

       明确任务:两个线程A和B,任务都是打印当前时间,要求编码实现:线程A和B同时启动后,以先A后B的方式任务交叉执行10次。

        对于这道题,首先,我们应该明确两个线程交互执行的含义:线程A和线程B共享一个处理机资源,线程A首先获得处理机,线程B处于就绪状态,线程A执行一次后,线程B获得处理机资源,线程A处于就绪状态,依次循环,直到线程A和线程B执行结束。

       解题思路:设置共享资源Object o = new Object(),设置互斥信号量boolean flag = true,进行线程同步,线程A执行一次后,唤醒线程B,线程A处于等待状态,线程B执行后亦是如此,如此循环往复,实现了线程A和线程B交互执行10次。

       代码如下:

import java.util.Date;public class ThreadEx {private Object o = new Object(); // 共享资源private boolean flag = true; // 互斥信号量class Thread1 extends Thread {public void run() {synchronized (o) { // 线程同步for (int i = 1; i <= 10; i++) {System.out.println("New thread-->A:" + new Date());o.notify(); // 唤醒另外一个进程if(flag){flag = false;try {o.wait(); // 当前线程等待} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println("Thread-->A complete");}}}class Thread2 extends Thread {public void run() {synchronized (o) { // 线程同步for (int i = 1; i <= 10; i++) {System.out.println("New thread-->B:" + new Date());o.notify(); // 唤醒另外一个进程if(!flag){flag = true;try {if(i != 10){o.wait(); // 当前线程等待}} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println("Thread-->B complete");}}}public void show(){new Thread1().start();new Thread2().start();}public static void main(String[] args) {ThreadEx t = new ThreadEx();t.show();}}       
打印结果:
New thread-->A:Mon Mar 31 19:39:27 CST 2014New thread-->B:Mon Mar 31 19:39:27 CST 2014New thread-->A:Mon Mar 31 19:39:27 CST 2014New thread-->B:Mon Mar 31 19:39:27 CST 2014New thread-->A:Mon Mar 31 19:39:27 CST 2014New thread-->B:Mon Mar 31 19:39:27 CST 2014New thread-->A:Mon Mar 31 19:39:27 CST 2014New thread-->B:Mon Mar 31 19:39:27 CST 2014New thread-->A:Mon Mar 31 19:39:27 CST 2014New thread-->B:Mon Mar 31 19:39:27 CST 2014New thread-->A:Mon Mar 31 19:39:27 CST 2014New thread-->B:Mon Mar 31 19:39:27 CST 2014New thread-->A:Mon Mar 31 19:39:27 CST 2014New thread-->B:Mon Mar 31 19:39:27 CST 2014New thread-->A:Mon Mar 31 19:39:27 CST 2014New thread-->B:Mon Mar 31 19:39:27 CST 2014New thread-->A:Mon Mar 31 19:39:28 CST 2014New thread-->B:Mon Mar 31 19:39:28 CST 2014New thread-->A:Mon Mar 31 19:39:28 CST 2014New thread-->B:Mon Mar 31 19:39:28 CST 2014Thread-->B completeThread-->A complete
0 0