Java多线程并发管理

在书上看到了一个好方法,当多个线程并发时,可以用scheduleAtFixedRate来管理,scheduleAtFixedRate定时执行一次任务,是重复执行,而ScheduledThreadPoolExecutor将只执行一次任务,

如果你有多个任务,同时进行,并且,是定时的执行,那么以下的程序,完全可以满足你的要求:

import java.util.concurrent.*;

import java.util.*;

public class TestGreenhouseScheduler {

private volatile boolean light = false;

private volatile boolean water = false;

private String thermostat = "Day";

public synchronized String getThermostat() {

return thermostat;

}

public synchronized void setThermostat(String value) {

thermostat = value;

}

//运行一次任务

ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(10);

public void schedule(Runnable event, long delay) {

scheduler.schedule(event, delay, TimeUnit.MILLISECONDS);

}

public void repeat(Runnable event, long initialDelay, long period) {

//scheduleAtFixedRate 定时执行一次任务,是重复执行

scheduler.scheduleAtFixedRate(event, initialDelay, period,

TimeUnit.MILLISECONDS);

}

class LightOn implements Runnable {

int j=0;

public void run() {

// Put hardware control code here to

// physically turn on the light.

System.out.println("Turning on lights"+"执行了"+(j++));

light = true;

}

}

class LightOff implements Runnable {

public void run() {

// Put hardware control code here to

// physically turn off the light.

System.out.println("Turning off lights");

light = false;

}

}

class WaterOn implements Runnable {

public void run() {

// Put hardware control code here.

System.out.println("Turning greenhouse water on");

water = true;

}

}

class WaterOff implements Runnable {

public void run() {

// Put hardware control code here.

System.out.println("Turning greenhouse water off");

water = false;

}

}

class ThermostatNight implements Runnable {

int j=0;

public void run() {

// Put hardware control code here.

System.out.println("Thermostat to night setting"+"执行了"+(j++));

setThermostat("Night");

}

}

class ThermostatDay implements Runnable {

public void run() {

// Put hardware control code here.

System.out.println("Thermostat to day setting");

setThermostat("Day");

}

}

class Bell implements Runnable {

int j= 0;

public void run() {

System.out.println("Bing!"+"执行了"+(j++));

}

}

class Terminate implements Runnable {

public void run() {

System.out.println("Terminating");

scheduler.shutdownNow(); //结束线程

// Must start a separate task to do this job,

// since the scheduler has been shut down:

new Thread() {

public void run() {

//最后一次执行

System.out.println("nowww");

}

}.start();

}

}

public static void main(String[] args) {

TestGreenhouseScheduler gh = new TestGreenhouseScheduler();

gh.schedule(gh.new Terminate(), 1000*7); //7秒运行一次任务,这里只执行一次

gh.repeat(gh.new Bell(), 0, 1000);//1秒执行一次任务,是重复执行

gh.repeat(gh.new ThermostatNight(), 0, 2000);

gh.repeat(gh.new LightOn(), 0, 3000);

}

}

---结果7秒之后,结束所有的线程,你看Bing执行了7次---

Bing!执行了0

Thermostat to night setting执行了0

Turning on lights执行了0

Bing!执行了1

Thermostat to night setting执行了1

Bing!执行了2

Bing!执行了3

Turning on lights执行了1

Bing!执行了4

Thermostat to night setting执行了2

Bing!执行了5

Bing!执行了6

Thermostat to night setting执行了3

Turning on lights执行了2

Terminating

Bing!执行了7

nowww

时间: 2024-11-12 19:14:10

Java多线程并发管理的相关文章

Java多线程并发09——如何实现线程间与线程内数据共享

本文将为各位带来 Java 阻塞队列相关只是.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程间数据共享 Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性.Java 内存模型(JMM)解决了可见性和有序性的问题,而锁解决了原子性的问题,理想情况下我们希望做到"同步"和"互斥".有以下常规实现方法: 将数据抽象成一个类 将数据抽象成一个类,并将对这个数据的操作作为这个类的方法,这么设计可以和

java 多线程并发问题总结

java 多线程并发主要通过关键字synchronized实现 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该ob

对JAVA多线程 并发编程的理解

对JAVA多线程并发编程的理解 Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结. 线程状态转换 Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是: ?  新建(New):创建后尚未启动的线程处于这种状态 ?  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可

Java多线程并发技术

Java多线程并发技术 参考文献: http://blog.csdn.net/aboy123/article/details/38307539 http://blog.csdn.net/ghsau/article/category/1707779 http://www.iteye.com/topic/366591 JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式

知识链-Java多线程并发

Java多线程并发 java并发容器(Map.List.BlockingQueue)

java多线程并发概览

一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. "同时"执行是人的感觉,在线程之间实际上轮换执行. 二.Java中的线程 在J

java多线程并发编程与CPU时钟分配小议

我们先来研究下JAVA的多线程的并发编程和CPU时钟振荡的关系吧 老规矩,先科普 我们的操作系统在DOS以前都是单任务的 什么是单任务呢?就是一次只能做一件事 你复制文件的时候,就不能重命名了 那么现在的操作系统,我一边在这边写BLOG,一边听歌,一边开着QQ,一边…………………… 显然,现在的操作系统都是多任务的操作系统 操作系统对多任务的支持是怎么样的呢? 每打开一个程序,就启动一个进程,为其分配相应空间(主要是运行程序的内存空间) 这其实就支持并发运行了 CPU有个时钟频率,表示每秒能执行

Java多线程并发基础面试题回答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态.多个线程共享堆内存(heap

Java 多线程并发编程面试笔录一览

知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法 方式二:声明实现 Runnable 接口的类.该类然后实现 run 方法 推荐方式二,因为接口方式比继承方式更灵活,也减少程序间的耦合. 3.获取当前线程信息? Thread.currentThread() 4.线程的分类 线程分为守护线程.用户线程.线程初始化默认为用户线程. setDaemon(true) 将该线程标记为