Timer& ScheduledThreadPoolExecutor 区别

package com.famous.thread.TimerExample;

import java.util.Timer;
import java.util.TimerTask;

public class TimerClient {

public static void main(String[] args) {

Timer timer = new Timer("数据库测试");
Timer timer2 = new Timer(true);

timer2.schedule(new TimerTask() {

@Override
public void run() {
System.err.println("延迟2000ms执行");
try {
Thread.sleep(4000);
System.err.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 2000, 2000);

timer2.schedule(new TimerTask() {
int i = 0;

@Override
public void run() {
System.err.println("two");
i++;
if (i > 3) {
throw new RuntimeException();
}
}
}, 2000, 2000);
}
}

a. Timer是基于绝对时间的。容易受系统时钟的影响。 
b. Timer只新建了一个线程来执行所有的TimeTask。所有TimeTask可能会相关影响 
c. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。

 主要:1:Timer只创建了一个线程。当你的任务执行的时间超过设置的延时时间将会产生一些问题

package com.famous.thread.TimerExample;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExecutorClient {
	public static void main(String[] args) {

		ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(
				3);

		executor.scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				System.err.println(11);
			}
		}, 1, 1, TimeUnit.SECONDS);

	}
}

newFixedThreadPool和

Semaphore

得区别:

newFixedThredPool控制线程执行得个数,但是Semaphore只是控制资源某个贡献变量得访问。是不一样得,比如使用

newCachedThreadPool

线程可能都执行到需要Semaphore控制得代码地方。但是使用Fixed。可能只有三个线程执行

你可能感兴趣的:(Timer& ScheduledThreadPoolExecutor 区别)