JAVA程序设计(18.2)----- 5条线程按照给定规律轮流打印 线程调度 线程池 synchronized wait notify

这次没有使用 有名内部类 将程序控制数据、执行程序都独立出来了

5条线程按照给定规律轮流打印 线程调度 线程池 synchronized wait notify

代码如下:

1.独立出来的内部控制数据类

package com.lovo.homework02;
/**
 * 类:将内部数据独立出来 方便修改和控制
 * @author Abe
 *
 */
public class PrintThreadContext {
	/**
	 * 允许执行的线程的key 初始值为3 (第4条线程)
	 */
	public static int allowedKey = 3;
	/**
	 * 方法:转换到下一个允许执行线程的key
	 * 这里是 下次执行本线程后的第二条线程,超出范围时,又从第一条线程开始数
	 */
	public static void next(){
		PrintThreadContext.allowedKey += 2;
		if (PrintThreadContext.allowedKey > 4) {
			PrintThreadContext.allowedKey %= 5;
		}
	}
	/**
	 * 循环运行次数
	 */
	public static int number  = 100;
}

2.线程的主程序

package com.lovo.homework02;

/**
 * 类:打印线程,按照PrintThreadContext.next()的规律打印
 * @author Abe
 */
public class PrintThread implements Runnable {
	private String str;
	private int key;
	private static Object obj = new Object();

	public PrintThread(String str, int key) {
		this.str = str;
		this.key = key;
	}

	@Override
	public void run() {
		for (int i = 0; i < PrintThreadContext.number; i++) {
			//这里还是加上了程序锁 而不是用while循环代替 是因为 随着线程的增多 每次只有一条线程能进入执行
			//其余的都在while里无限循环 我的机器就瞬间卡爆了…… 直到执行完才能动……
			synchronized (obj) {
				while (key != PrintThreadContext.allowedKey) {
					try {
						obj.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.print(str);
				//调用方法:next()
				PrintThreadContext.next();
				obj.notifyAll();
			}
		}
	}
}

3.执行程序

package com.lovo.homework02;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 类:打印线程的执行程序,
 * @author Abe
 *
 */
public class PrintThreadRunner {
	public static void main(String[] args) {
		ExecutorService service = Executors.newFixedThreadPool(5);
		String[] strs = { "A", "B", "C", "D", "E" };
		for (int i = 0; i < 5; i++) {
			service.execute(new PrintThread(strs[i], i));
		}
		service.shutdown(); //记住关闭线程池
	}
}
时间: 2024-08-27 01:15:41

JAVA程序设计(18.2)----- 5条线程按照给定规律轮流打印 线程调度 线程池 synchronized wait notify的相关文章

JAVA程序设计(18.1)----- 1多线程轮流打印 线程调度 线程池 synchronized wait notify 内部类

1.两个线程 一个打印A 一个打印B 另两个线程轮流进行打印工作 多线程初级应用 线程调度  线程池(预先建立N个线程,需要的程序直接调用,执行完毕后归还回线程池,典型的以空间换时间 synchronized wait notify  内部类使用 package com.lovo; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 类:测试 wait notify 用

线程笔记一:java线程经典题目:轮流打印

题目:构建四个线程,线程A将变量100加1,B减1,c加1,D减1,要按照A->B->C->D的顺序执行,最终数字还为100.使用多线程 代码: PrintLetter.java import java.lang.Thread; class MyThread implements Runnable{ //给线程分配三个对象 private Object pre; private Object self; private Num num; public MyThread(Object pr

Java程序设计之线程池应用

这里简单说一个线程池的小应用,从控制台输入线程访问的线程数量,输出输出工作的线程名,之前先构造一个包含了5条线程的对象. 代码: import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Threadd { public static void main(String[] args) { // TODO Aut

南邮JAVA程序设计实验4 线程程序设计(指针式时钟)

南邮JAVA程序设计实验4  线程程序设计(指针式时钟) 实验目的: 本实验旨在通过实验,培养学生将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序的能力. 实验内容: 设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动. 实验设计: 主要是控制时针分针秒针的转动度数,这个直接通过坐标的三角函数值求得,线程方面,隔一秒休眠一下,然后通过时分秒的换算关系来改变三个对应指示针在时钟上的位置 实验代码: import java.awt.*;

2018面向对象程序设计(java)课程学习进度条

<2018面向对象程序设计(java)课程学习进度条> 周次 (阅读/编写)代码行数 发布博客量/博客评论量 课堂/课余学习时间(小时) 最满意的编程任务 第一周 40/20 1/0 4/5 九九乘法表 第二周 100/40 1/1 4/5 实验3 第三周 300/ 1/0 4/7 第四周 第五周 第六周 第七周 第八周 第九周 第十周 第十一周 第十二周 第十三周 第十四周 第十五周 第十六周 第十七周 累计 原文地址:https://www.cnblogs.com/tangyuechen/

2019面向对象程序设计(java)课程学习进度条

2019面向对象程序设计(java)课程学习进度条 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 20/10 1/0 5 九九乘法表 2 200/40 2/4 8 第三章实验三,实验四: 第三章案例LotteryOdds.java                                                                                                  

扎西平措 201571030332 《面向对象程序设计(java)课程学习进度条》

<面向对象程序设计(java)课程学习进度条> 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 第一周 20/6 1/0 4 JDK.eclipse的安装.九九乘法表的编译 第二周 200/50 2/0 7 数据类型的总结,第三章实验四.实验五.实验六 …… …… …… …… 第17周 累计 420/40 2/0 14 ... ... 原文地址:https://www.cnblogs.com/zhaxipingcuo/p/11

20145317彭垚 《Java程序设计》第6周学习总结

20145317彭垚 <Java程序设计>第6周学习总结 第十章 输入/输出 10.1 InputStream与OutputStream 1.串流设计的概念 Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象. 从应用程序角度来看,如果要将数据从来源取出,可以使用输入串流,如果要将数据写入目的地,可以使用输出串流.在Java中,输入串流代表对象为java.io.Inputstream实例,输出串流代表对象为java.io.OutputStream实例. 在不使用Inpu

Java程序设计总复习题

 Java程序设计总复习题 1.编写一个Java程序在屏幕上输出"你好!".(p13,例1-1) //programme name Helloworld.java public class Helloworld { public static void main(String args[]) { System.out.print ("你好!" ); } } 2. 编写一个Java程序,用if-else语句判断某年份是否为闰年. // Programme Name L