2个线程 循环打印ababab...

摘要:
2个线程各自调用A,B*/publicclassWork{volatilestaticbooleanflag=true;publicsynchronizedvoidprintA(){System.out.println;while{if(!

第一种方式:

package mianshi.Thread;

/**
 * 2个线程 循环打印 abab
 * 实现1:
 * note: 2个线程操作 Work类, work类里面 实现互斥的 2个打印方法 A B。 2个线程各自调用A,B
 */
public class ThreadA {

    public static void main(String[] args) {
        Work t = new Work();
        new Thread(new Runnable() {
            @Override
            public void run() {
                t.printA();
                //t.printD();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                t.printB();
                //t.printC();
            }
        }).start();

    }
}
package mianshi.Thread;

/**
 * note: work类里面 实现互斥的 2个打印方法 A B。 2个线程各自调用A,B
 */
public classWork{
    volatile static boolean flag = true;

    public synchronized voidprintA() {
        System.out.println("AAAA");
        while (true) {
            if (!flag) {
                try{
                    wait();
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("a");
            flag = false;
            this.notifyAll();
        }
    }

    public synchronized voidprintB() {
        System.out.println("bbbb");
        while (true) {
            if(flag) {
                try{
                    wait();
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("b");
            flag = true;
            this.notifyAll();
        }
    }

    public voidprintC() {
        System.out.println("c");
    }

    public synchronized voidprintD() {
        System.out.println("d");
    }
}

第二种方式:

1 packagemianshi.Thread;
2 
3 /**
4 * 2个线程 循环打印 abab
5 * 实现2:
6 * note: 2个线程操作一个对象,主要是利用这个对象的 wait,notify,synchronize,然后 2个线程各自调用A,B
7  */
8 public classPrintAB {
9     static boolean flag = true;
10 
11     public static voidmain(String[] args) {
12         PrintAB t = newPrintAB();
13 
14         new Thread(newRunnable() {
15 @Override
16             public voidrun() {
17                 synchronized(t) {
18                     while (true) {
19                         if (!flag) {
20                             try{
21 t.wait();
22                             } catch(InterruptedException e) {
23 e.printStackTrace();
24                             } finally{
25 }
26 }
27                         System.out.println("a");
28                         flag = false;
29 t.notifyAll();
30 }
31 }
32 }
33 }).start();
34 
35         new Thread(newRunnable() {
36 @Override
37             public voidrun() {
38                 synchronized(t) {
39                     while (true) {
40                         if(flag) {
41                             try{
42 t.wait();
43                             } catch(InterruptedException e) {
44 e.printStackTrace();
45                             } finally{
46 }
47 }
48                         System.out.println("b");
49                         flag = true;
50 t.notifyAll();
51 }
52 }
53 }
54 }).start();
55 }
56 }

免责声明:文章转载自《2个线程 循环打印ababab...》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Solr集群—SolrCloudJavascript中的url编码与解码(详解)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

从源码中学习设计模式系列——单例模式序/反序列化以及反射攻击的问题(二)

一、前言 这篇文章是学习单例模式的第二篇,之前的文章一下子就给出来看起来很高大上的实现方法,但是这种模式还是存在漏洞的,具体有什么问题,大家可以停顿一会儿,思考一下。好了,不卖关子了,下面我们来看看每种单例模式存在的问题以及解决办法。 二、每种Singleton 模式的演进 模式一 public classLazySingleton {...

浅谈java中线程和操作系统线程

  在聊线程之前,我们先了解一下操作系统线程的发展历程,在最初的时候,操作系统没有进程线程一说,执行程序都是串行方式执行,就像一个队列一样,先执行完排在前面的,再去执行后面的程序,这样的话很多程序的响应就很慢,而且有些程序是io型操作居多,很多时间都在等待中浪费了,这时候进程应运而生,现在面试的都知道进程是资源管理的最小单位,线程是cpu调度的最小单位(其...

C# 主线程 辅助线程

主线程:就是UI线程;从主线程通过Thread.Start或AsyncDelegate.BeginEnvoke(可带参数、定义回调方法、避免轮询)将进入辅助线程;采用异步的方式调用委托可以在界面重绘时避免工作线程被阻塞;从主线程中调用委托的AsyncDelegate.EndEnvoke方法将进入辅助线程(EndInvoke()是阻塞方法,在回调方法中调用E...

消息机制、子窗口和父窗口的消息传递

1. 什么是窗口 MSDN: In a graphical Win32-based application, a window is a rectangular area of the screen where the application displays output and receives input from the user. Theref...

web 阶段的一些简答题

1.jsp 9个隐含对象 2. jsp 4大域对象 3.mybatis 中 #{} %{ } 的区别于联系 4. Servlet容器默认是采用单实例多线程的方式处理多个请求的: 5.Cookie 与Session 的异同 6. 请描述对web 服务器的理解(Tomcat),请列举出tomcat7下的目录以及各个目录的作用 7. 请描述 servlet与st...

服务CPU 100%排查思路

出处: https://www.cnblogs.com/dennyzhangdd/p/11585971.html 一、引子   对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高。 二、问题复现   线上系统突然运行缓慢,CPU飙升,甚至到100%...