3つのスレッドがそれぞれA、B、Cを印刷します.マルチスレッドプログラミングで実現してください.画面にABCABCを10回繰り返し印刷してください.
6711 ワード
テーマ:3つのスレッドがそれぞれA、B、Cを印刷することがあって、マルチスレッドのプログラミングで実現して下さい、スクリーンの上で循環して10回ABCABCを印刷します...
方法1:lockとconditionを用いてa実行完了通知b実行,b実行完了通知c実行,c実行完了通知a実行の順序を実現し,Executorsのfixedthreadpoolを用いて3つのスレッドをスレッドプールに入れ,スレッドプール制御プログラムの終了を用いてshutdown()メソッドを呼び出す.
結果:
1回目の実行A 1回目の実行B 1回目の実行C 2回目の実行A 2回目の実行B 3回目の実行C 3回目の実行B 3回目の実行C 4回目の実行B 4回目の実行C 5回目の実行B 5回目の実行C 6回目の実行A 6回目B 6回目C 7回目A 7回目B 7回目C 8回目B 8回目C 9回目B 9回目C 10回目A 10回目B 10回目C 10回目
Process finished with exit code 0
https://mouselearnjava.iteye.com/blog/1949228
方法2:lockを用いて、共通統計回数で判断して順序印刷を実現し、1つのスレッドがロックを解除した後、自分と他のスレッドが同時に共通ロックを奪い取り、ロックを手に入れ、whileの中の判読条件が満たされてから印刷する.
結果:
ABCABCABCABCABCABCABCABCABCABC
ここを見たら、左上の「注目」ボタンをクリックして、右上の小さな手をクリックして、コメントをあげて、注目して、行きましょう.☺
方法1:lockとconditionを用いてa実行完了通知b実行,b実行完了通知c実行,c実行完了通知a実行の順序を実現し,Executorsのfixedthreadpoolを用いて3つのスレッドをスレッドプールに入れ,スレッドプール制御プログラムの終了を用いてshutdown()メソッドを呼び出す.
package com.ljf.thread.demo.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Resources {
public static String threadName="A";// A;
public static Lock lock=new ReentrantLock();
public static Condition conA=lock.newCondition();
public static Condition conB=lock.newCondition();
public static Condition conC=lock.newCondition();
}
package com.ljf.thread.demo.lock;
public class ThreadA implements Runnable{
public void run() {
for(int k=0;k<10;k++){
Resources.lock.lock();
try {
while(!Resources.threadName.equals("A")){
try {
Resources.conA.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//
System.out.println(String.format(" %d ",k+1));
System.out.println("A");
// b
Resources.threadName="B";
Resources.conB.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
Resources.lock.unlock();
}
}
}
}
package com.ljf.thread.demo.lock;
public class ThreadB implements Runnable {
public void run() {
for(int k=0;k<10;k++){
Resources.lock.lock();
try {
while(!Resources.threadName.equals("B")){
try {
Resources.conB.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//
System.out.println(String.format(" %d ",k+1));
System.out.println("B");
// b
Resources.threadName="C";
Resources.conC.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
Resources.lock.unlock();
}
}
}
}
package com.ljf.thread.demo.lock;
public class ThreadC implements Runnable{
public void run() {
for(int k=0;k<10;k++){
Resources.lock.lock();
try {
while(!Resources.threadName.equals("C")){
try {
Resources.conC.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//
System.out.println(String.format(" %d ",k+1));
System.out.println("C");
// b
Resources.threadName="A";
Resources.conA.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
Resources.lock.unlock();
}
}
}
}
package com.ljf.thread.demo.lock;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class TestABC {
public static void main(String args[]){
ExecutorService es= Executors.newFixedThreadPool(3);
es.execute(new ThreadA());
es.execute(new ThreadB());
es.execute(new ThreadC());
es.shutdown();
}
}
結果:
1回目の実行A 1回目の実行B 1回目の実行C 2回目の実行A 2回目の実行B 3回目の実行C 3回目の実行B 3回目の実行C 4回目の実行B 4回目の実行C 5回目の実行B 5回目の実行C 6回目の実行A 6回目B 6回目C 7回目A 7回目B 7回目C 8回目B 8回目C 9回目B 9回目C 10回目A 10回目B 10回目C 10回目
Process finished with exit code 0
https://mouselearnjava.iteye.com/blog/1949228
方法2:lockを用いて、共通統計回数で判断して順序印刷を実現し、1つのスレッドがロックを解除した後、自分と他のスレッドが同時に共通ロックを奪い取り、ロックを手に入れ、whileの中の判読条件が満たされてから印刷する.
package com.ljf.interview.thread;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
public class Resource {
public static int count=10;
public static int cnt=0;
public static ReentrantLock locks=new ReentrantLock();
}
package com.ljf.interview.thread;
public class PrintA implements Runnable{
@Override
public void run() {
for(int k=0;k<10;){
try {
Resource.locks.lock();
System.out.println("aaaa");
while (Resource.cnt % 3 == 0) {// , if, ,
System.out.print("A");
Resource.cnt++;
k++;
}
} finally {
Resource.locks.unlock();// lock() unlock() try/catch
}
}
}
}
package com.ljf.interview.thread;
public class PrintB implements Runnable {
@Override
public void run() {
for (int k = 0; k < 10; ) {
try {
Resource.locks.lock();
System.out.println("bbbb");
while (Resource.cnt % 3 == 1) {// , if, ,
System.out.print("B");
Resource.cnt++;
k++;
}
} finally {
Resource.locks.unlock();// lock() unlock() try/catch
}
}
}
}
package com.ljf.interview.thread;
import java.util.concurrent.locks.ReadWriteLock;
public class PrintC implements Runnable{
@Override
public void run() {
for(int k=0;k<10;){
try {
Resource.locks.lock();
System.out.println("ccc");
while (Resource.cnt % 3 == 2) {// , if, ,
System.out.print("C");
Resource.cnt++;
k++;
}
} finally {
Resource.locks.unlock();// lock() unlock() try/catch
}
}
}
}
package com.ljf.interview.thread;
public class PrintTask {
public static void main(String args[]){
new Thread(new PrintA(),"1").start();
new Thread(new PrintC(),"3").start();
new Thread(new PrintB(),"2").start();
}
}
結果:
ABCABCABCABCABCABCABCABCABCABC
ここを見たら、左上の「注目」ボタンをクリックして、右上の小さな手をクリックして、コメントをあげて、注目して、行きましょう.☺