一个优秀的软件不会随意的创建很销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互。因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理。 JDK提供了四种不同的线程池给程序员使用 首先使用线程池,需要用到ExecutorService接口,该接口有个抽象类AbstractExecutorService对其进行了实现,ThreadPoolExecutor进一步对抽象类进行了实现。最后JDK封装了...
void notify() 唤醒在此对象监视器上等待的单个线程 void notifyAll() 唤醒在此对象监视器上等待的所有线程 void wait() 导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()方法 关于等待/通知,要记住的关键点是:必须从同步环境内调用wait()、notify()、notifyAll()方法。线程不能调用对象上等待或通知的方法,除非它拥有那个对象的锁。 wait()、notify()、notifyAll()都是Object的实例方...
Java线程池使用说明一 简介线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的。在jdk1.5之后这一情况有了很大的改观。Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。二:线程池线程池的作用:线程池作用就是限制系统中执行线程的数量。 根据系统的环境情况,可以自动或手动设置线程...
1.Restaurantpackage Produce;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;class Meal {privatefinalint orderNum;public Meal(int orderNum) {this.orderNum = orderNum;}@Overridepublic String toString() {return "Meal " + orderNum;}
}class WaitPerson implements Runnable {private Restaurant restaurant;public WaitPerson(Restaurant ...
ThreadPoolExecutor创建和管理线程池,减少内存消耗,提高执行效率。任务执行过程
1.当线程数小于核心线程数时,创建线程;
2.当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列;
3.当线程数大于等于核心线程数,且任务队列已满:若线程数小于最大线程数,创建线程若线程数等于最大线程数,执行拒绝策略(抛出异常、拒绝任务等)任务执行APIpublic void execute(Runnable command)
public <T> Future<T> submit(Ca...
原文链接 Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么...
一、立即加载/"饿汉模式"和延迟加载/"懒汉模式"立即加载(又称饿汉模式):在使用类的时候已经将对象创建完毕,常见实现方法是直接new实例化延迟加载(又称懒汉模式):在调用get()方法时实例才被创建,常见实现方法是在get()方法中进行new实例化二、懒汉模式在多线程下的缺点及解决缺点:可能会出现多个实例的问题。解决:1、声明synchronized关键字:对get方法加上synchronized关键字即可保证同步运行,但效率太低。2、尝试同步代...
一、固定大小的线程池,newFixedThreadPool:package Executor.test;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;publicclass ExecutorTest {publicstaticvoid main(String[] args) {// TODO Auto-generated method stub doExecutor();}staticvoid doExecutor(){//create reuse,fix number,thread poolExecutorService pool = Executors.newFixedThreadPool(5);//create threadsT...
Java实现多线程的3种方法:继承Thread类、实现runnable接口、使用ExecutorService,Callable、Future实现有返回值的多线程。前2种线程的实现方式没有返回值,第三种实现方式可以获取线程执行的返回值。
一:继承java.lang.Thread类public class MyThread extends Thread {@Overridepublic void run() {System.out.println( "my thread begin." );try {// 休眠1000毫秒Thread.sleep( 1000 );} catch ( InterruptedException e ) {e....
进程:任务任务并发执行是一个宏观概念,微观上是串行的。进程的调度是有OS负责的(有的系统为独占式,有的系统为共享式,根据重要性,进程有优先级)。 由OS将时间分为若干个时间片。JAVA在语言级支持多线程。分配时间的仍然是OS。 1package TomTexts;2 3publicclass TomTexts_21 {4publicstaticvoid main(String args[])5 {6int data1[]={2,4,6,8,10,12};7int data2[]={1,0,2,4,3};8try 9 {
10for(int i=0;i<data1.length...
假设现在系统有两个线程,这两个线程分别代表存款者和取钱者——现在假设系统有一种特殊的要求,系统要求存款者和取钱者不断地重复存款、取钱的动作。而且要求每当存款者将钱存入指定账户后,取钱者就立即取出该笔钱。不允许存款者连续两次存钱,也不允许取钱者连续两次取钱。为了实现这种功能,可以借助Object类提供的wait()、notify()、notifyAll() 3 个方法,这3个方法并不属于Thread类,而是属于Object类。但这3 个方法必须由同...
题目要求:有4个线程,其中两个线程每次对x加1,另外两个每次对x减1,如何实现?
分析:
x就是这4个线程要处理的共享数据,不同种线程有不同的处理方式,但操作的数据是共同的,联想到“窗口买票问题”,但是卖票只是单纯的减。
所以,多个线程访问共享对象或数据的方式,先看,如果每个线程执行的代码相同,那么就可以使用同一个Runnable对象,这个对象中有被共享的数据,如买票问题。如果每个线程执行的代码不同,肯定需要不用...
一、创建线程的三种方式第一种publicclass App {publicstaticvoid main(String[] args) {Thread thread = new Thread(() -> {while (true) {System.out.println("testThread");}});thread.start();}
}第二种publicclass App {publicstaticvoid main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublicvoid run() {while (true) {System.out.println("testThread");}}});thread.start();}
}第二种和第一种...
可见性 所谓可见性,指的是当一个线程修改了对象的状态后,其他线程能够看到该对象发生的变化。在单线程环境下,向某个变量写入值,然后在后面的操作再读取,在这个过程中该变量的值对该线程来说总是可见。但是,在多线程环境下,可见性就不一定等到保证,例如,对于一个共享变量 share = 0 来说,线程1和线程2都进行share++ 操作,但是最终share 的结果并不一定是2。先看看一段代码publicclass NoVisibility {privatestaticboo...
java并发编程笔记(九)——多线程并发最佳实践使用本地变量使用不可变类最小化锁的作用域范围使用线程池Executor,而不是直接new Thread执行宁可使用同步也不要使用线程的wait和notify使用BlockingQueue实现生产-消费模式使用并发集合而不是加了锁的同步集合(比如Collections.synchronized这些集合尽量避免使用,应该用J.U.C中提供的专门的同步集合)使用Semaphore创建有界的访问宁可使用同步代码块,也不要使用同步的方法避免使用...