本文共 2192 字,大约阅读时间需要 7 分钟。
有一连串任务,需要两个线程交替执行。线程1执行完任务1后,线程2才能执行任务2,接下来线程1执行任务1,如此交替执行下去。直到所有任务执行完毕。
定义Repo类代表任务仓库,使用字符串代表任务。该类拥有:
构造函数:/将传递进来的字符串以空格分隔分解为多个不同的任务,并存储起来。如"1 2 3 4 5 6"被分解成6个任务1,2,3,4,5,6/
public Repo(String items) { }方法:
int getSize(); //返回Repo包含的任务数量。注意:完成任务的时候,需要将任务删除。
//其他完成任务的方法定义Worker1与Worker2类,代表两个交替完成任务的类,可以从Repo对象中获取任务。
main函数如下:
public class Main {
public static void main(String[] args) throws InterruptedException { Scanner sc = new Scanner(System.in); Repo repo = new Repo(sc.nextLine()); Thread t1 = new Thread(new Worker1(repo)); Thread t2 = new Thread(new Worker2(repo)); t1.start(); Thread.yield(); t2.start(); sc.close(); } }输入样例
1 2 3 4 5 6 7 8 9
输出样例
Thread-0 finish 1
Thread-1 finish 2 Thread-0 finish 3 Thread-1 finish 4 Thread-0 finish 5 Thread-1 finish 6 Thread-0 finish 7 Thread-1 finish 8 Thread-0 finish 9裁判测试程序:
/Repo代码/
/Worker1代码/
/Worker2代码/
/系统已有代码,无需关注/
import java.util.*;class Repo { static ArrayLista = new ArrayList (); static boolean k=false; public Repo(String items) { String e[] = items.split("\\s+"); for (int i = 0; i < e.length; i++) { a.add(e[i]); } } public Repo() { } public int getSize() { return a.size(); } public synchronized void getNum() { if(k==false) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else { System.out.println(Thread.currentThread().getName()+" finish "+a.get(0)); a.remove(0); k=false; this.notify(); } } public synchronized void getNum2() { if(k==true) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else { System.out.println(Thread.currentThread().getName()+" finish "+a.get(0)); a.remove(0); k=true; this.notify(); } }}class Worker1 implements Runnable { Repo repo = new Repo(); public Worker1(Repo repo) { super(); this.repo = repo; } public void run() { while(repo.a.size()>0) { repo.getNum2(); } }}class Worker2 implements Runnable { Repo repo = new Repo(); public Worker2(Repo repo) { super(); this.repo = repo; } public void run() { while(repo.a.size()>0) { repo.getNum(); } }}
转载地址:http://dqbdi.baihongyu.com/