1. 程式人生 > >實現併發執行緒按順序輸出123

實現併發執行緒按順序輸出123

問題:
有first,second,third,forth四個執行緒,first輸出1,second輸出2,third輸出3,forth輸出4。要求, 同時啟動四個執行緒, 按順序輸出1234, 且未無限迴圈輸出。

這是一個多執行緒協同的問題,本身多執行緒是沒有執行順序的, 順序不一定。
但是可以採取一定方式使多執行緒按一定順序執行。

ReentrantLock

ReentrantLock來解決, 還有個state整數用來判斷輪到誰執行了。

public class PrintTwo {
    private static Lock lock = new ReentrantLock();//通過JDK5中的鎖來保證執行緒的訪問的互斥
private static int state = 0; static class First extends Thread { @Override public void run() { while (true) { lock.lock(); if (state % 4 == 0) { System.out.println("1"); state++; } lock.unlock(); } } } static
class Second extends Thread { @Override public void run() { while (true) { lock.lock(); if (state % 4 == 1) { System.out.println("2"); state++; } lock.unlock(); } } } static
class Third extends Thread { @Override public void run() { while (true) { lock.lock(); if (state % 4 == 2) { System.out.println("3"); state++; } lock.unlock(); } } } static class Forth extends Thread { @Override public void run() { while (true) { lock.lock(); if (state % 4 == 3) { System.out.println("4"); state++; } lock.unlock(); } } } public static void main(String[] args) { First first = new First(); Second second = new Second(); Third third = new Third(); Forth forth = new Forth(); first.start(); second.start(); third.start(); forth.start(); } }

Semphore

Semphore,完成對訊號量的控制,可以控制某個資源可以被同時訪問的個數,通過acquire()獲取一個許可,如果沒有就等待,而release()釋放一個許可。(另外,semphore還可以用來控制同時訪問一個方法的執行緒數:https://blog.csdn.net/anhenzhufeng/article/details/70225415 )

package Thread;

import java.util.concurrent.Semaphore;

public class Print1234 {
    public static Semaphore sem1;
    public static Semaphore sem2;
    public static Semaphore sem3;
    public static Semaphore sem4;

    static class FirstThread extends Thread {
        public void run() {
            try {
                while (true) {
                    sem1.acquire();
                    System.out.println("1");
                    sem2.release();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class SecondThread extends Thread {
        public void run() {
            try {
                while (true) {
                    sem2.acquire();
                    System.out.println("2");
                    sem3.release();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class ThirdThread extends Thread {
        public void run() {
            try {
                while (true) {
                    sem3.acquire();
                    System.out.println("3");
                    sem4.release();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class ForthThread extends Thread {
        public void run() {
            try {
                while (true) {
                    sem4.acquire();
                    System.out.println("4");
                    sem1.release();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        sem1 = new Semaphore(1);
        sem2 = new Semaphore(1);
        sem3 = new Semaphore(1);
        sem4 = new Semaphore(1);
        try {
            // 不要有sem1.acquire()
            sem2.acquire();
            sem3.acquire();
            sem4.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new FirstThread().start();
        new SecondThread().start();
        new ThirdThread().start();
        new ForthThread().start();

    }
}

volatile

volatile,保證被修飾的變數在讀寫前都會與主存互動更新。一個變數被volatile修飾後,則不同執行緒對這個變數進行操作時,總是從記憶體中讀取最新值,即每次更新對其他執行緒都是立即可見的。

public class PrintThree {
    volatile static int state = 0;

    static class First extends Thread {
        @Override
        public void run() {
            while (true) {
                if (state % 4 == 0) {
                    System.out.println("1");
                    state++;
                }
            }
        }
    }

    static class Second extends Thread {
        @Override
        public void run() {
            while (true) {
                if (state % 4 == 1) {
                    System.out.println("2");
                    state++;
                }
            }
        }
    }

    static class Third extends Thread {
        @Override
        public void run() {
            while (true) {
                if (state % 4 == 2) {
                    System.out.println("3");
                    state++;
                }
            }
        }
    }

    static class Forth extends Thread {
        @Override
        public void run() {
            while (true) {
                if (state % 4 == 3) {
                    System.out.println("4");
                    state++;
                }
            }
        }
    }

    public static void main(String[] args) {
        First first = new First();
        Second second = new Second();
        Third third = new Third();
        Forth forth = new Forth();
        first.start();
        second.start();
        third.start();
        forth.start();
    }
}

相關推薦

實現併發執行順序輸出123

問題:有first,second,third,forth四個執行緒,first輸出1,second輸出2,third輸出3,forth輸出4。要求, 同時啟動四個執行緒, 按順序輸出1234, 且未無限迴圈輸出。這是一個多執行緒協同的問題,本身多執行緒是沒有執行順序的, 順序不一定。但是可以採取一定方式使多執

執行併發(三)使用join方法讓執行順序執行

一.執行緒的join方法作用 join方法把指定的執行緒新增到當前執行緒中,可以不給引數直接thread.join(),也可以給一個時間引數,單位為毫秒thread.join(500)。事實上join方法是通過wait方法來實現的。比如執行緒A中加入了執行緒B.join方法

a,b,c三個執行順序列印數字1-96 執行a列印1,b列印2,c列印3

程式的主入口 公共的物件鎖 列印方法的核心執行緒 具體的實現程式碼 PrintThread   public class PrintThread implements Runnable { private String name;//執行緒名稱

如何保證執行順序執行

/* 有三個執行緒T1 T2 T3,如何保證他們按順序執行-轉載 在T2的run中,呼叫t1.join,讓t1執行完成後再讓T2執行 在T2的run中,呼叫t2.join,讓t2執行完成後再讓T3執行 */ public class ThreadByOrder { static Thread

讓10個執行順序打印出0123456789

思路 1、通過公正瑣object對10個執行緒進行管理,喚醒所有執行緒或者阻塞等待。 2、通過orderNum通知下一個執行緒需要輸出的數字 程式碼 public class Printer { private static final

用三個執行順序迴圈列印abc 三個字母,比如abcabcabc

執行緒類 import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Ree

兩個執行順序列印1~10

<pre name="code" class="cpp">#include <stdio.h> #include <stdlib.h> #include <p

join()之讓執行順序執行

Thread中的join() 主執行緒建立並啟動子執行緒,如果子執行緒中要進行大量的耗時運算,主執行緒往往將在子執行緒執行結束前結束。如果主執行緒想等待子執行緒執行完成後再結束(如,子執行緒處理一個數據,主執行緒需要取到這個值),則需要用到join()。

執行順序交替列印ABC的四種方法

建立三個執行緒A、B、C,A執行緒列印10次字母A,B執行緒列印10次字母B,C執行緒列印10次字母C,但是要求三個執行緒同時執行,並且實現交替列印,即按照ABCABCABC的順序列印。 二、Synchronized同步法 1、基本思路 使用同步塊和wait、notify的

多個執行順序執行——join()

package com.jjyy.thread; /** * 假如有三個執行緒T1,T2,T3,如何保證T2在T3之前執行完成,T1在T2之前完成? * @author jiangyu 2015年9月7日 * 注意:執行緒的優先順序無法保障執行緒的執行次序。只不過優先

三個執行分別列印ABC,順序輸出ABCABC...

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <vector> #include

Java併發程式設計(6):Runnable和Thread實現執行的區別(含程式碼)

Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Thread類有如下優勢: 1、可以避免由於Java的單繼承特性而帶來的侷限; 2、增強程式的健壯性,程式碼能夠被多個執行

乾貨!執行池+CountDownLatch,實現執行併發計算、彙總

目錄結構 抽象類:求和器 單執行緒 求和器 VS 多執行緒 求和器 1)執行緒池 多個執行緒 一起併發執行,效能很生猛 2)CountDownLatch 主執行緒 使用 latch.await() 阻塞住,直到所有 子任務 都執行完畢了

Java併發(十八):阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆(一)之 圖文解析 和 C語言的實現執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

C#多執行基礎,實現主子執行有序輸出

建立控制檯程式 using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace AsyncThread { publi

執行同步之——兩個執行序列順序列印奇數和偶數的兩種實現

題目:一道經典的執行緒併發的問題,執行緒a列印1、3、5……,執行緒b列印2、4、6……,兩個執行緒交替執行輸出1、2、3、4、5、6…… 要點: package com.test; import java.util.concurrent.locks.

Java(三)併發控制5.繼承建立執行實現建立執行之間的區別

這是使用繼承建立的執行緒 class Person extends Thread { private int num=50; public Person(String name) { super(name); } public void run()

執行程式設計(二)——面試題,每個執行只打印一種字元,多個執行協同順序列印n次字串(求大神的其他實現方案)

(這個是歡聚時刻(YY)的筆試題,在筆試的時候沒有寫出來,後來自己寫了出來,希望大神能給出更優秀的解決方案……ps:現在面試官總有面試時問筆試程式設計題思路的習慣,呵呵) 題目簡述: 輸入一個字串以

OkHttp實現執行併發下載的筆記

         打個廣告,不瞭解OkHttp的話可以先看下  http://blog.csdn.net/brycegao321/article/details/51830525             需求:  手機拍攝若干張照片, 在wifi連線下上傳到伺服器。  

Callable+ThreadPoolExecutor實現執行併發並獲得返回值

前言 經常會遇到一些效能問題,比如呼叫某個介面,可能要迴圈呼叫100次,並且需要拿到每一次呼叫的返回結果,通常我們都是放在for迴圈中一次次的序列呼叫,這種方式可想而知道有多慢,那怎麼解決這個問題呢? 多執行緒 為了解決以上問題,我使用的方式是多執行緒。多