Java多线程,线程交替执行

两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。

Code:

package com.qhong;

public class Main {
    /*
       * 两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。
       */
    private static int state = 1;
    private static int num1 = 1;
    private static int num2 = 2;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final Main t=new Main();
        new Thread(new Runnable(){
            @Override
            public void run(){
                while(num1<100){
                    //两个线程都用t对象作为锁,保证每个交替期间只有一个线程在打印
                    synchronized(t){
                        // 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒
                        if(state!=1){
                            try{
                                t.wait();
                            }catch(InterruptedException e){
                                e.printStackTrace();
                            }
                        }
                        // 当state=1时, 轮到线程1打印5次数字
                        for(int j=0;j<5;j++){
                            System.out.println(num1);
                            num1 +=2;
                        }
                        // 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印
                        state = 2;
                        // notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁
                        t.notifyAll();
                    }
                }
            }
        }).start();

        new Thread(new Runnable(){
            @Override
            public void run(){
                while(num2<100){
                    synchronized(t){
                        if(state!=2){
                            try{
                                t.wait();
                            }catch(InterruptedException e){
                                e.printStackTrace();
                            }
                        }

                        for(int i=0;i<5;i++){
                            System.out.println(num2);
                            num2 +=2;
                        }

                        state=1;
                        t.notifyAll();
                    }

                }
            }
        }).start();
    }
}

Output:

1
3
5
7
9
2
4
6
8
10
11
13
15
17
19
12
14
16
18
20
21
23
25
27
29
22
24
26
28
30
31
33
35
37
39
32
34
36
38
40
41
43
45
47
49
42
44
46
48
50
51
53
55
57
59
52
54
56
58
60
61
63
65
67
69
62
64
66
68
70
71
73
75
77
79
72
74
76
78
80
81
83
85
87
89
82
84
86
88
90
91
93
95
97
99
92
94
96
98
100

http://blog.csdn.net/junli_chen/article/details/49584187

时间: 2024-12-10 19:31:04

Java多线程,线程交替执行的相关文章

java 多线程–线程交替

要求: 借助同步机制,sleep()方法,join()方法,实现动画显示:甲线程:1.3.5.7.9乙线程:2.4.6.8.10丙线程:a.b.c.d.emain()线程输出:线程开始,线程结束 输出结果:线程开始,1-a-2## 3-b-4## 5-c-6## … 思考: 使用多个判断标记,模拟(消费者-生产者)每线程输出一个后就等待,然后改变自己的标记临界资源–使用多个== putX() == 方法,判断属于自己的标记(== isEmptyX ==)然后输出使多个线程有序的交替执行代码: c

Java多线程的交替执行

读完Think In Java的多线程,深有感悟,花了1个小时,写了一个多线程交替执行程序,大家可以参考,如有好的意见,请提出,谢谢! package com.thread; public class ThreadTest implements Runnable { public void run() { int j = 0; while (true) { try { synchronized (this) { if (j == 5) { j = 0; Tmp.getA().setOnoff(t

java 多线程—— 线程让步

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 java 多线程—— 线程让步 概述 第1 部分 yield()介绍 第2 部分 yield()示例 第3 部分 yield() 与 wait()的比较 第1 部分 yield()介绍 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”

java 多线程—— 线程等待与唤醒

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 wait(), notify(), notifyAll()等方法介绍 第2部分 wait()和notify()示例 第3部分 wait(long timeout)和notify() 第4部分 wait() 和 notifyAll() 第5部分 

Java多线程——线程之间的同步

Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,以及如何使用synchronized关键字和volatile关键字. 部分内容来自以下博客: https://www.cnblogs.com/hapjin/p/5492880.html https://www.cnblogs.com/paddix/p/5367116.html https://www.cnblogs.com/paddix/p/5428507.html https://www.cnblogs.com/liu

Java中线程顺序执行

现有线程threadone.threadtwo和threadthree,想要的运行顺序为threadone->threadtwo->threadthree,应该如何处理?这里需要用到一个简单的线程方法join(). join()方法的说明:join方法挂起当前调用线程,直到被调用线程完成后在继续执行(join() method suspends the execution of the calling thread until the object called finishes its ex

Java多线程——线程同步

在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的控制吧. 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问.   一.多线程引起的数据访问安全问题 下面看一个经典的问题,银行取钱的问题: 1).你有一张银行卡,里面有50

Java多线程——线程阻塞工具类LockSupport

简述 LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞. 和 Thread.suspend()相比,它弥补了由于 resume()在前发生,导致线程无法继续执行的情况. 和 Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出 InterruptedException 异常. LockSupport 的静态方法 park()可以阻塞当前线程,类似的还有 parkNanos().parkUntil()等方法.它们实现了一个限时等待,如下图

Java多线程——线程池

系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似的是,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象传给线程池,线程池就会启动一条线程来执行该对象的run方法,当run方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个Runnable对象的run方法. 除此之外,使用线程池可以有效地控制系统

Java多线程——线程的生命周期和状态控制

一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它