java线程——多个线程之间切换执行

目标:Number线程类执行数字的递增并输出,并且没增加两个就切换到另外一个线程,Letter线程类执行字母的递增并输出,并且没输出一个就切换到另外一个线程。

主类:

public static void main(String[] args) {

Print print = new Print();

Number number = new Number(print);

Letter letter = new Letter(print);

Thread thread = new Thread(number);

Thread thread2 = new Thread(letter);

thread.start();

thread2.start();

}

数字类:

private Print print;

/**
 * 带参数的构造方法传入 print对象 确保两个线程类操作的是同一个对象
 *
 * @param print
 */
public Number(Print print) {
    super();
    this.print = print;
}

@Override
public void run() {
    if (print.getTemp()) {//如果符合条件就往下执行
        synchronized (print) {//该对象获得锁
            for (int i = 1; i <= 52; i++) {
                System.out.println(i);
                if (i % 2 == 0) {
                    try {
                        print.setTemp(false);//首先把标志更改
                        print.notifyAll();//唤醒其他所有正在等待的线程
                        print.wait();//并把此线程处于等待状态
                        print.notify();//唤醒此线程,防止程序执行到最后仍处于未停止状态
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                }

            }
        }
    }
}

字母类:

private Print print;

public Letter(Print print) {
    super();
    this.print = print;
}

@Override
public void run() {
    if (!print.getTemp()) {
        synchronized (print) {
            for (int i = 65; i <= 90; i++) {
                System.out.println((char) i);
                try {
                    print.setTemp(true);
                    print.notifyAll();
                    print.wait();
                    print.notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    }

标识类:

private boolean temp = true;
public boolean getTemp() {
    return temp;
}

public void setTemp(boolean temp) {
    this.temp = temp;
}
时间: 2024-07-28 15:09:03

java线程——多个线程之间切换执行的相关文章

java并发系列(二)-----线程之间的协作(wait、notify、join、CountDownLatch、CyclicBarrier)

在java中,线程之间的切换是由操作系统说了算的,操作系统会给每个线程分配一个时间片,在时间片到期之后,线程让出cpu资源,由其他线程一起抢夺,那么如果开发想自己去在一定程度上(因为没办法100%控制它)让线程之间互相协作.通信,有哪些方式呢? wait.notify.notifyAll 1.void wait( ) 导致当前的线程等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法 2.void wait(long timeout) 导致当前的线程等待,直到

java中等待所有线程都执行结束

转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原文如下http://software.intel.com/zh-cn/blogs/2013/10/15/java-countdownlatchcyclicbarrier/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&a

Java学习之==&gt;Java线程生命周期与状态切换

一.Java线程生命周期与状态切换 这些状态的描述可以总结成下图: NEW 一个刚创建但尚未启动的Java线程实例就是处于 NEW 状态 public class App { public static void main(String[] args) { Thread thread = new Thread(); Thread.State state = thread.getState(); System.out.println(state); } } // 输出结果 NEW RUNNABLE

java中线程存活和线程执行的问题!

1 /* 2 下面的程序会出现下面的情况,当Thread-0, Thread-1, Thread-2都被wait的时候,可能会同时苏醒 3 Thread-0 put 4 Thread-1 put 5 Thread-2 put 6 Thread-3 get//在此处,Thread-3拿到锁之后,将所有的等待的线程唤醒,才有了下面的输出 7 Thread-2 put 8 Thread-1 put 9 Thread-0 put 10 */ 11 12 13 虽然多个线程会同时苏醒,但是只有一个能获得c

Java 中的守护(Daemon)线程中finally代码块是否执行的问题

http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html 这篇文章应该是Thinking in Java 中文版中的一段,关于线程-守护线程(Daemon Thread)的介绍 可能是我理解de不好,我对书对于daemon thread 中的finally是否执行的介绍有点迷糊了,故自己写个方法测试之后才搞明白. 就拿书中的例子做进一步说明.先来看下原文:不看我的罗嗦,可以直接看文章结尾的结论. import java.u

Java多线程之后台线程不执行finally

后台线程不执行finally package wzh.daemon; import java.util.concurrent.TimeUnit; class ADaemon implements Runnable { @Override public void run() { try { System.out.println("Starting ADaemon"); TimeUnit.SECONDS.sleep(1); } catch (Exception e) { System.ou

android脚步---如何看log之程序停止运行,和UI线程和非UI线程之间切换

经常运行eclipse时,烧到手机出现,“停止运行”,这时候得通过logcat查log了.一般这种情况属于FATAL EXCEPTION,所以检索FATAL 或者 EXCEPTION,然后往下看几行 例子: 11-26 16:18:17.949: E/AndroidRuntime(5363): FATAL EXCEPTION: Thread-19311-26 16:18:17.949: E/AndroidRuntime(5363): Process: com.scme.jiance, PID:

java高并发编程--04--Hook线程以及捕获线程执行异常

1.获取线程运行时异常Thread类处理运行时异常的四个API:public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh):为某个线程UncaughtExceptionHandlerpublic static setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh):设置全局UncaughtExceptionHandlerpublic Uncaugh

死磕 java线程系列之线程池深入解析——未来任务执行流程

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普通任务的执行流程,但其实线程池中还有一种任务,叫作未来任务(future task),使用它您可以获取任务执行的结果,它是怎么实现的呢? 建议学习本章前先去看看彤哥之前写的<死磕 java线程系列之自己动手写一个线程池(续)>,有助于理解本章的内容,且那边的代码比较短小,学起来相对容易一些. 问题