博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6-2 jmu-Java-07多线程-交替执行 (25分)
阅读量:4035 次
发布时间:2019-05-24

本文共 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 ArrayList
a = 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/

你可能感兴趣的文章
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
补充自动屏蔽攻击ip
查看>>
谷歌走了
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>
关于对象赋值及返回临时对象过程中的构造与析构
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
SQL 多表联合查询
查看>>