java多线程
2016-03-03 14:59
417 查看
多线程:在一个程序中允许同时运行多个任务
在java中,每个任务都是Runnable接口的一个实例,也称为可运行对象,线程本质上讲就是便于任务执行的对象。
任务就是对象,为了创建任务,首先必须为任务定义一个类。任务类必须实现Runnable接口。Runnable接口非常简单,只包含一个run方法。需要实现run方法告诉系统线程将如何运行。
开发一个任务类:
public class TaskClass implements Runnable{
public TaskClass(){}
public void run(){}
}
一旦定义一个TaskClass类,就可以用它的构造方法创建一个任务
TaskClass newTask = new TaskClass();
任务必须在线程中执行,Thread类包括创建线程的构造方法以及控制线程的很多有用的方法,创建线程:
Thread thread = new Thread(newTask);
然后调用start()方法告诉java虚拟机该线程准备运行
thread.start()
java虚拟机通过调用任务的run方法执行任务
线程池:对于大量的任务如果为每个任务都创建一个线程时不可取的,线程池是管理并发执行任务个数的理想方法。java提供Executor接口执行线程池中的任务,提供ExecutorService接口来管理和控制任务。ExecutorService是Executor的子接口。
为创建Executor对象,可以使用Executors类中的静态方法--newFixedThreadPool(int) 方法在池中创建固定数目的线程
//创建一个最大线程数为3的线程池执行器
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.execute(new PrintCharTask('a', 100));
executor.execute(new PrintCharTask('b', 100));
executor.execute(new PrintNumTask(1, 100));
executor.shutdown();//关闭执行器
线程同步:
避免竞争状态,应该防止对个线程同时进入程序的某一特定部分,程序中的这部分叫做临界区。可使用关键字synchronized来同步方法,以便一次只有一个线程可以访问方法。
利用加锁同步:一个锁是Lock接口的实例,它定义了加锁和释放锁的方法,lock(),unlock();锁也可以使用newCondition()方法来创建任意个数的Condition对象,用来进行线程通信。
ReentrantLock 是为创建相互排斥的锁的Lock的具体实现。
private static Lock lock = new ReentrantLock();//创建一个lock
将临界区的内容放在try-catch中,先调用lock.lock()
在final中使用lock.unlock();
线程间相互协作:
使用条件便于线程间通信,一个线程可以指定在某种条件下该做什么,条件是通过调用Lock对象的newCondition()方法而创建对象,一旦创建了对象,就可以使用await(),signal(),signalAll()方法实现线程间的通信,await()方法可以让当前线程都处于等待状态,直到条件发生;singal()方法唤醒一个等待线程;signalAll()方法唤醒所有线程。
private static Condition newDeposit = lock.newCondition();
java内置监视器:
线程通信使用对象的内置监视器编程实现。
监视器是一个相互排斥具备同步能力的对象。监视器中的一个时间点上,只能有一个线程执行一个方法。线程通过获取监视器上的锁进入监视器,并且通过释放锁退出监视器。任意对象都可能是一个监视器。一旦一个线程锁住对象,该对象就成为监视器。加锁是通过在方法或块上使用synchronized关键字来实现的。在执行同步方法或块前,必须获取锁。如果条件不适合线程继续在监视器内执行,线程可能在监视器中等待。可以对监视器对象调用wait()方法来释放锁,这样其他的监视器中的线程就能获取它,也就有可能改变监视器的状态。当条件适合时,另一个线程可以调用notify()和notifyAll()方法来通知一个或所有的等待线程重新获取锁,并且恢复执行
在java中,每个任务都是Runnable接口的一个实例,也称为可运行对象,线程本质上讲就是便于任务执行的对象。
任务就是对象,为了创建任务,首先必须为任务定义一个类。任务类必须实现Runnable接口。Runnable接口非常简单,只包含一个run方法。需要实现run方法告诉系统线程将如何运行。
开发一个任务类:
public class TaskClass implements Runnable{
public TaskClass(){}
public void run(){}
}
一旦定义一个TaskClass类,就可以用它的构造方法创建一个任务
TaskClass newTask = new TaskClass();
任务必须在线程中执行,Thread类包括创建线程的构造方法以及控制线程的很多有用的方法,创建线程:
Thread thread = new Thread(newTask);
然后调用start()方法告诉java虚拟机该线程准备运行
thread.start()
java虚拟机通过调用任务的run方法执行任务
线程池:对于大量的任务如果为每个任务都创建一个线程时不可取的,线程池是管理并发执行任务个数的理想方法。java提供Executor接口执行线程池中的任务,提供ExecutorService接口来管理和控制任务。ExecutorService是Executor的子接口。
为创建Executor对象,可以使用Executors类中的静态方法--newFixedThreadPool(int) 方法在池中创建固定数目的线程
//创建一个最大线程数为3的线程池执行器
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.execute(new PrintCharTask('a', 100));
executor.execute(new PrintCharTask('b', 100));
executor.execute(new PrintNumTask(1, 100));
executor.shutdown();//关闭执行器
线程同步:
避免竞争状态,应该防止对个线程同时进入程序的某一特定部分,程序中的这部分叫做临界区。可使用关键字synchronized来同步方法,以便一次只有一个线程可以访问方法。
利用加锁同步:一个锁是Lock接口的实例,它定义了加锁和释放锁的方法,lock(),unlock();锁也可以使用newCondition()方法来创建任意个数的Condition对象,用来进行线程通信。
ReentrantLock 是为创建相互排斥的锁的Lock的具体实现。
private static Lock lock = new ReentrantLock();//创建一个lock
将临界区的内容放在try-catch中,先调用lock.lock()
在final中使用lock.unlock();
线程间相互协作:
使用条件便于线程间通信,一个线程可以指定在某种条件下该做什么,条件是通过调用Lock对象的newCondition()方法而创建对象,一旦创建了对象,就可以使用await(),signal(),signalAll()方法实现线程间的通信,await()方法可以让当前线程都处于等待状态,直到条件发生;singal()方法唤醒一个等待线程;signalAll()方法唤醒所有线程。
private static Condition newDeposit = lock.newCondition();
java内置监视器:
线程通信使用对象的内置监视器编程实现。
监视器是一个相互排斥具备同步能力的对象。监视器中的一个时间点上,只能有一个线程执行一个方法。线程通过获取监视器上的锁进入监视器,并且通过释放锁退出监视器。任意对象都可能是一个监视器。一旦一个线程锁住对象,该对象就成为监视器。加锁是通过在方法或块上使用synchronized关键字来实现的。在执行同步方法或块前,必须获取锁。如果条件不适合线程继续在监视器内执行,线程可能在监视器中等待。可以对监视器对象调用wait()方法来释放锁,这样其他的监视器中的线程就能获取它,也就有可能改变监视器的状态。当条件适合时,另一个线程可以调用notify()和notifyAll()方法来通知一个或所有的等待线程重新获取锁,并且恢复执行
相关文章推荐
- 算法导论--JAVA实现合并排序详解
- Java NIO使用及原理分析(二)
- leetcode:Merge Sorted Array 【Java】
- axis2通过wsdl2java.bat生成webservice异步客户端程序
- Iframe 高度自适应解决方案
- Java中gitter、setter方法和public的区别
- Java - Hash - HashMap与HashTable
- Java抽象类
- Java NIO使用及原理分析 (一)
- Java基础知识点记录(主要记录一些不常见或者容易忘记的知识点,时刻更新)
- Java多线程之concurrent包(六)——CountDownLatch
- 关于java.lang.reflect.MalformedParameterizedTypeException错误的问题
- Spring mvc 3 返回json 406错误
- java RSA加密解密
- spring 的controller返回JSON的集中方法
- 使用java中replaceAll方法替换字符串中的反斜杠
- java实现并查集
- [hadoop2.7.2]搭建eclipse源码阅读环境
- Java多线程之concurrent包(五)——CyclicBarrier
- java处理图片