线程概念
:
线程是计算机的最小执行单位。进程有多条线程,但是线程只有一个进程。如果程序的执行路径有多条,则称之为多线程程序。
线程的优先级有协同式调度和抢占式调度
。
线程通信
三个函数可以当做线程通信的函数
wait();
notify();
notifyAll();
注意:
wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。
wait()函数使线程进入等待状态,而且必须拥有这个线程的锁。
调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程。
可以唤醒这个线程。如果有多个线程,那只能唤醒其中一个线程。
notifyAll()函数可以唤醒monitor所有的线程。
线程池
提供一定数量的线程,来完成更多的线程工作
线程池的种类
单个线程:
newSingleThreadExecutor();
线程池中只有一个线程执行。
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
for(int i=0;i<4;i++){
newSingleThreadExecutor.submit(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"执行完成>>>>>");
}
}
结果为
多个线程
newFixedThreadPool(int nThreads)
线程池中有多个线程同时执行,多个线程执行遵循Java的优先级调度。
(int nThreads):设置执行的线程个数,必须是int型。
ExecutorService newSingleThreadExecutor = Executors.newFixedThreadPool(4);
CountDownLatch c = new CountDownLatch(10);// 同步辅助类,所有的线程所共享的
long s = System.currentTimeMillis();// 时间
for (int i = 0; i < 4; i++) {
newSingleThreadExecutor.submit(new MyTask2(c));
}
System.out.println(">>>>>>>>>>>>");
newSingleThreadExecutor.shutdown();// 线程池的关闭
while(true){
if(c.getCount()==0){
System.out.println("线程池已经执行结束");
System.out.println("执行时间为:"+(System.currentTimeMillis()-s)+" 毫秒数");
break;
}
}
结果为
带缓冲的线程池
newCachedThreadPool()
它创建了一个可缓存的线程池。当有新的任务提交时,有空闲线程则直接处理任务,没有空闲线程则创建新的线程处理任务,队列中不储存任务。线程池不对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
ExecutorService executor = Executors.newCachedThreadPool();
final CountDownLatch c = new CountDownLatch(10);// 所有的线程所共享的
for (int i = 0; i < 4; i++) {
executor.submit(new Runnable() {
public void run() {
System.out.println("hello");
c.countDown();
}
});
}
结果为
可调度的线程池
ScheduledThreadPoolExecutor(int corePoolSize)
这种线程池可以进行调度处理。可另外调度在给定延迟之后运行的命令,或定期执行(类似于每天的闹钟提醒,使线程进入循环,谨慎使用)。
延迟任务执行时间早于启用,但没有任何实时保证,在启用后,他们将开始。 计划执行完全相同执行时间的任务将以先进先出(FIFO)的提交顺序启用。
提交的任务在运行之前被取消,执行被抑制。 默认情况下,这样一个取消的任务在工作队列中不会自动删除,直到其延迟过去。
虽然这样可以进一步检查和监控,但也可能导致取消任务的无限制保留。 为避免这种情况,请将setRemoveOnCancelPolicy(boolean)设置为true ,这将导致任务在取消时立即从工作队列中删除。
A ThreadPoolExecutor可另外调度在给定延迟之后运行的命令,或定期执行。 该类优选的是Timer需要多个工作线程时,或当附加灵活性或能力ThreadPoolExecutor需要
eclipse中对ScheduledThreadPoolExecutor的解释
public <V> ScheduledFuture<V> schedule(Callable<V> callable,
long delay,
TimeUnit unit)
定时器定时任务
ScheduledThreadPoolExecutor方法中的时间控制函数
TimerTask task =new TimerTask(){
@Override public void run() {
System.out.println(">>>"+System.currentTimeMillis());
System.out.println("hello");
}};
// 定时器
Timer timer=new Timer(); timer.schedule(task, 1000, 2000);// 毫秒