實現併發執行緒按順序輸出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迴圈中一次次的序列呼叫,這種方式可想而知道有多慢,那怎麼解決這個問題呢? 多執行緒 為了解決以上問題,我使用的方式是多執行緒。多