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 用法
 * 顺次打印AB
 * @author Abe
 */
public class TestNotify {
	public static void main(String[] args) {
		// 创建线程池 大小为2
		ExecutorService service = Executors.newFixedThreadPool(2);
		// 分别初始化两条线程 并start
		String[] str = { "A", "B" };
		for (int i = 0; i < 2; i++) {
			service.execute(new MyPrinter(str[i], 100));
		}
		// 所有线程结束后 关闭线程池
		service.shutdown();
	}
}

/**
 * 内部类:线程运行内容 接口Runable并重写run方法
 *
 * @author Abe
 *
 */
class MyPrinter implements Runnable {
	private String str;
	private int number;
	public static boolean check = false;
	private static Object obj = new Object();

	public MyPrinter(String str, int number) {
		this.str = str;
		this.number = number;
	}

	public String getStr() {
		return str;
	}

	public void print() {
		System.out.print(str);
	}

	/**
	 * 重写方法 : 线程运行的方法  A	 0锁定程序  2先唤醒等待池 3 A打印 4进入等待池,并解锁程序
	 *  					B 	1程序被锁定在程序外等待(非进入等待池)5程序解锁, 进入并锁定程序
	 *  						6先唤醒等待池 7此时A被唤醒,但是程序被锁,在程序外等待
	 *  						8 B打印 9 进入等待池,并解锁程序
	 *  					A	从B-5开始重复循环。。。 

	 */
	@Override
	public void run() {
		//第一次只能打印为A的线程进来 之后check变true 所有线程都能进来 此句失效
		while (check == false && !this.str.equals("A")) {}
		for (int i = 0; i < number; i++) {
			synchronized (obj) {
				obj.notify();
				print();
				check = true;
				try {
					//∞	各自循环到自己的最后一次时 不再进入等待池,线程终止
					if (i < number - 1) {
						obj.wait();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
时间: 2024-10-25 06:55:20

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

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

这次没有使用 有名内部类 将程序控制数据.执行程序都独立出来了 5条线程按照给定规律轮流打印 线程调度 线程池 synchronized wait notify 代码如下: 1.独立出来的内部控制数据类 package com.lovo.homework02; /** * 类:将内部数据独立出来 方便修改和控制 * @author Abe * */ public class PrintThreadContext { /** * 允许执行的线程的key 初始值为3 (第4条线程) */ publi

C# 多线程的自动管理(线程池) 基于Task的方式

C# 多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况:    1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,然后给予响应.这一般使用 ThreadPool(线程池)来解决.     2. 线程平时都处于休眠状态,只是周期性地被唤醒.这一般使用 Timer(定时器)来解决. ThreadPool 类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 Windows 2000 以上系统支持,因为其中某些方法调用了只有高版本的Windows 才有的

【转载】5天不再惧怕多线程——第五天 线程池

说到多线程,不可不说线程池,C#中关于池的概念很多,今天来整理下ThreadPool的使用. 是的,如果你很懒,如果你的执行任务比较短,如果你不想对线程做更精细的控制,那么把这些繁琐的东西丢给线程池吧. 一:ThreadPool 好了,下面看看TheadPool下有哪些常用的方法. 1:GetMaxThreads,GetMinThreads 首先我们肯定好奇线程池到底给我们如何控制线程数,下面就具体的看一看. 1 class Program 2 { 3 static void Main(stri

《java.util.concurrent 包源码阅读》09 线程池系列之介绍篇

concurrent包中Executor接口的主要类的关系图如下: Executor接口非常单一,就是执行一个Runnable的命令. public interface Executor { void execute(Runnable command); } ExecutorService接口扩展了Executor接口,增加状态控制,执行多个任务返回Future. 关于状态控制的方法: // 发出关闭信号,不会等到现有任务执行完成再返回,但是现有任务还是会继续执行, // 可以调用awaitTe

《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分

这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecut

C#多线程之旅(3)——线程池

v博客前言 先交代下背景,写<C#多线程之旅>这个系列文章主要是因为以下几个原因:1.多线程在C/S和B/S架构中用得是非常多的;2.而且多线程的使用是非常复杂的,如果没有用好,容易造成很多问题. v写在前面 多线程,有利也有弊,使用需谨慎. v正文开始 原文地址:C#多线程之旅(3)——线程池 C#多线程之旅目录: C#多线程之旅(1)——介绍和基本概念 C#多线程之旅(2)——创建和开始线程 C#多线程之旅(3)——线程池 C#多线程之旅(4)——同步本质 ...... 一.介绍 无论你什

《java.util.concurrent 包源码阅读》14 线程池系列之ScheduledThreadPoolExecutor 第一部分

ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类,同时实现了ScheduledExecutorService接口. public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService ScheduledThreadPoolExecutor的功能主要有两点:在固定的时间点执行(也可以认为是延迟执行),重复执行.

《java.util.concurrent 包源码阅读》10 线程池系列之AbstractExecutorService

AbstractExecutorService对ExecutorService的执行任务类型的方法提供了一个默认实现.这些方法包括submit,invokeAny和InvokeAll. 注意的是来自Executor接口的execute方法是未被实现,execute方法是整个体系的核心,所有的任务都是在这个方法里被真正执行的,因此该方法的不同实现会带来不同的执行策略.这个在后面分析ThreadPoolExecutor和ScheduledThreadPoolExecutor就能看出来. 首先来看su

《java.util.concurrent 包源码阅读》11 线程池系列之ThreadPoolExecutor 第一部分

先来看ThreadPoolExecutor的execute方法,这个方法能体现出一个Task被加入到线程池之后都发生了什么: public void execute(Runnable command) { if (command == null) throw new NullPointerException(); /* 如果运行中的worker线程数少于设定的常驻线程数,增加worker线程,把task分配给新建的worker线程 */ int c = ctl.get(); if (worker