多线程顺序打印

前言:

下面的代码是参考网址:http://love3400wind.blog.163.com/blog/static/796308012013117102941831/ , http://blog.csdn.net/liu251/article/details/6227763 做了一点点的改动。

感谢两位作者!

题目:

有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C

要求, 同时启动三个线程, 按顺序输出ABC, 循环10次

package org.wit.ff.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *
 * @author F.Fang
 *
 */
public class ABCDemo {

    private Lock lock = new ReentrantLock();// 通过JDK5中的锁来保证线程的访问的互斥
    private Condition condition = lock.newCondition();// 线程协作

    public static void main(String[] args) {
        ABCDemo abc = new ABCDemo();

        // 使用循环可以不局限于只有3个线程 交替, 任意多个都可以.
        PrintThread a = abc.new PrintThread("A", true);
        PrintThread b = abc.new PrintThread("B", false);
        PrintThread c = abc.new PrintThread("C", false);

        a.setNext(b);
        b.setNext(c);
        c.setNext(a);

        ExecutorService executor = Executors.newFixedThreadPool(3);// 通过线程池执行
        for (int i = 0; i < 3; i++) {
            executor.execute(a);
            executor.execute(b);
            executor.execute(c);
        }
        executor.shutdown();//关闭线程池
    }

    class PrintThread implements Runnable {
        private String name;

        private PrintThread next;

        private boolean execute;

        public PrintThread(String name, boolean execute) {
            this.name = name;
            this.execute = execute;
        }

        public PrintThread(String name, PrintThread next, boolean execute) {
            this.name = name;
            this.next = next;
            this.execute = execute;
        }

        public void run() {
            lock.lock();
            try {
                while (true) {

                    if (execute) {
                        // 执行当前业务
                        print();
                        // 当前任务执行完成后 改变执行状态为false
                        execute = false;
                        // 将下一个相邻任务状态设置为true
                        next.setExecute(true);
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        // 通知其它任务.
                        condition.signalAll();
                        break;
                    } else {
                        try {
                            // 若非执行状态 即等待.
                            condition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            } finally {
                lock.unlock();
            }
        }

        public void print() {
            System.out.println(name);
        }

        public void setExecute(boolean execute) {
            this.execute = execute;
        }

        public void setNext(PrintThread next) {
            this.next = next;
        }

    }

}
时间: 2024-10-11 15:54:40

多线程顺序打印的相关文章

Condition实现多线程顺序打印

Condition实现多线程顺序打印: 1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.ReentrantLock; 3 4 public class Run { 5 6 volatile public static int nextPrintWho = 1; 7 private static ReentrantLock lock = new ReentrantLock(); 8

JAVA 多线程开篇 -从按顺序打印ABC开始

序言 很想把一个问题弄清楚,特别是以前一直模模糊糊的并发编程,今天在华为OJ上碰到一道题,“顺序打印ABC的两种方法开始写起”,就以这道题开篇,希望日后有时间把并发编程的基本问题弄清楚. 问题 启动三个线程,一个线程打印A,一个打印B,一个打印C,按顺序打印ABC.....如输入3,输出就是“ABCABCABC” 程序 线程的调度是由系统操作的,要想多个线程按照要求顺序打印,就必须做好线程间的同步. 思路:四个线程循环打印,但是一个线程打印一个字母释放锁后无法确定获得锁的是哪一个线程,这就需要用

多线程练习--顺序打印ABC十次

这是迅雷的一道面试题,顺序打印ABC十次. public class TenABC { public static void main(String[] args) { final BlockingQueue queue = new ArrayBlockingQueue(30); for (int i = 0; i < 10; i++) { try { queue.put("A"); queue.put("B"); queue.put("C"

Java多线程循环打印ABC的5种实现方法

题目:3个线程循环打印ABC,其中A打印3次,B打印2次,C打印1次,循环打印2轮一.Synchronized同步法思路:使用synchronized.wait.notifyAll的方法利用线程标记变量控制三个线程的执行顺序. /** * @author XDarker * 2018-5-17 */public class Main { public static void main(String[] args) throws InterruptedException { int num = 1

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

剑指offer(五十三)之按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 代码: <span style="color:#000099;">import java.util.ArrayList; import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = n

多线程顺序的控制(wait,notity,sleep)

public class abc extends Thread{    private Object prev=null;    private Object self=null;    private String msg=null;    public abc(Object prev,Object self,String msg){        this.prev=prev;        this.self=self;        this.msg=msg;    }    publi

输入n,按顺序打印1到最大的n位十进制数

1 /* 2 *题目要求:输入n,按顺序打印1到最大的n位十进制数 3 *比如:输入3,则打印1,2,...999 4 *更新日期:2015-06-15 5 */ 6 7 //注意题目中的陷阱,当n稍微大一点的时候会溢出,所以使用字符串输出的策略 8 9 #include<iostream> 10 using namespace std; 11 12 void 13 Print_number_byte(unsigned char num) 14 { 15 if(num<1)return