多线程2

1. wait()和sleep()的区别?

sleep():必须指定时间,不释放锁

wait():  可以指定时间,也可以不指定;释放锁

2. 为什么wait()、notify()、notifyAll()方法必须定义在Object中?

因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意对象,所以定义在Object类中。

3. 线程池;

使用Runnable子类对象作为submit方法的参数

/*
 * 线程池的使用:
 * A:创建一个线程池对象,控制要创建几个线程池对象
 * 
 * B:这种线程池的对象可以执行Runnable对象或Callable对象代表的线程
 * C:调用如下方法:
 * <T> Future<T> submit(Callable<T> task)  提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。 
 * Future<?> submit(Runnable task) 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 
 * D:结束:
 *  void shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。 
 */
public class ExecutorsDemo {
	public static void main(String[] args) {
		//创建一个线程池对象,控制要创建几个线程对象
		//public static ExecutorService newFixedThreadPool(int nThreads)
		ExecutorService es = Executors.newFixedThreadPool(2);
		//RunnableDemo是实现了Runnable接口的类
		es.submit(new RunnableDemo());
		es.submit(new RunnableDemo());
		//结束线程池
		es.shutdown();
	}
}

使用Callable子类对象作为submit方法的参数

public class ExecutorsDemo1 {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		// 创建线程池对象,同时规定创建两个线程
		ExecutorService es = Executors.newFixedThreadPool(2);
		// <T> Future<T> submit(Callable<T> task)
		Future<Integer> f = es.submit(new MyCallable(100));
		Future<Integer> ff = es.submit(new MyCallable(50));
		// V get() 如有必要,等待计算完成,然后获取其结果。 V即为对应的泛型
		Integer sum1 = f.get();
		Integer sum2 = ff.get();
		System.out.println(sum1+"---"+sum2);
		//关闭线程
		es.shutdown();
	}
}
class MyCallable implements Callable<Integer> {
	private int number;
	public MyCallable(int number) {
		this.number = number;
	}
	//带返回值,加泛型
	//这里实现一个求和案例
	@Override
	public Integer call() throws Exception {
		int sum = 0;
		for (int i = 1; i <= number; i++) {
			sum += i;
		}
		return sum;
	}
}

4. 计时器的应用:
import java.util.Timer;
import java.util.TimerTask;

/*
 * 定时器:可以让我们在指定的时间内做某件事情,还可以重复的做某件事情
 * 依赖Timer和TimerTask这两个类
 * Timer:
 *	 Timer()  创建一个新计时器。
 *	 void schedule(TimerTask task, long delay) 	安排在指定延迟后执行指定的任务。 
 *	 void schedule(TimerTask task, long delay, long period)  安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。 
 *	 void schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
 *	 void cancel()  终止此计时器,丢弃所有当前已安排的任务。  
 * TimerTask:  由 Timer 安排为一次执行或重复执行的任务。 
 */
public class TimerDemo {
	public static void main(String[] args) {
		Timer t = new Timer();
		// 在三秒后执行任务
		 t.schedule(new Mytask(t), 3000);
		// 在三秒后执行任务,并在两秒延迟后重复执行,后面的参数为毫秒值
		//t.schedule(new Mytask(), 3000, 2000);
	}
}
class Mytask extends TimerTask {
	private Timer t;
	// 无参构造
	public Mytask() {
	}
	// 带参构造,将Timer对象赋值给成员变量,便于调用cancel()方法
	public Mytask(Timer t) {
		this.t = t;
	}
	@Override
	public void run() {
		// 这里写需要被执行的代码
		System.out.println("好好学习");
		// 结束任务
		t.cancel();
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值