JAVA学渣之路--并发篇三

  1. awaitTermination()方法
    ExecutorService的awiatTermination()方法,可以设置两个参数,第一个参数计量数,第二个参数时间计量单位(TimeUnit),这两个参数决定了在规定的时间内,所有的任务在达到超时时间之前都将全部结束,如果任务自己结束了,则返回true,如果任务没有结束,则返回false,同时终止任务。

  2. 线程的四种状态
    JAVA中一个线程可以处于下述四种状态的一种:
    a、new(新建):一般是线程刚被创建时,已经分配了必需的系统资源,并执行了初始化。此时线程已经有资格获得CPU时间了,之后调度器将会将这个线程转变为可运行或阻塞状态。
    b、Runnable(就绪):一般是调度器只要将当前的时间片给了该线程,该线程即可运行。一般是由于调度器时间片没有赋予或者新建后调度器调度未到导致处于该状态。
    c、Blocked(阻塞):线程能运行,但是由于某个必须条件阻止了它的运行。当线程处于阻塞状态时,调度器将忽略该线程,不会分配给线程任何CPU时间。知道线程重新进入了就绪状态,它才有可能继续执行操作。一般一个线程进入阻塞状态大概有如下原因:1)通过调用TimeUnit.sleep(milliseconds)使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行。2)通过调用wait()使线程被挂起,知道线程得到了notify()或者nofifyAll()消息时才会重新进入就绪状态。3)任务在等待某个输入输出完成。4)任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个线程已经获取了对象锁。
    d、Dead(死亡):线程死亡或终止状态,此时,该线程将不会得到CPU时间,它的任务已经结束了。一般任务死亡的方式是从run()方法中返回了,或这被中断了。

  3. 中断!!
    中断,我这里一般用于打断当前被阻塞的线程,由于当前我们处理线程都是使用ExecutorService的方式,让executors替我们管理线程,所以按照我们之前发起线程的方式(exec.execute(new Runnable)),没有办法做到控制线程,在线程的run()方法中打断。打断阻塞的线程,一般采用如下方法:
    1)使用ExecutorService.submit(new Runnable())的方式。当然这个方法返回的是Future的类型对象。在我们想要中断当前的线程时,可以使用返回的对象调用cancel(true)方法。
    2)是使用Thread管理线程,这样可以直接操作到线程,使用方法为在对应的线程Thread调用interrupt()对象,这个方法也可以打断当前的线程。但是有个弊端,就是没法打断两种阻塞的线程,一种是由于等待I/O操作而阻塞的线程,一种是由于没有获取到对象锁而阻塞的线程。但是针对这两种情况,我们可以借鉴第三中方法。
    3)直接关闭底层资源,底层资源一关闭当前线程就会由于AsynchronousCloseException错误抛出而中断线程。

  4. 检查中断
    在任务的run()中,调用Thread.interrupted()可检测外部有没有给当前线程设置中断,
    代码如下:

class Blocked3 implements Runnable {
	private volatile double d = 0.0;
	public void run() {
		try {
			while(!Thread.interrupted()) {
				NeedsCleanup n1 = new NeedsCleanup(1);
				try {
					System.out.println("Sleeping");
					TimeUnit.SECONDS.sleep(1);
					// NeedsCleanup n2 = new NeedsCleanup(2);
					try {
						System.out.println("Calculating");
						for(int i = 1; i < 2500000; i++) {
							d = d + (Math.PI + Math.E) / d;
						}
						System.out.println("Finished time-consuming operation");
					} finally {
						// n2.cleanup();
					}
				} finally {
					n1.cleanup();
				}
			}
			System.out.println("Exiting via while() test");
		} catch(InterruptedException e) {
			System.out.println("Exiting via InterruptedException");
		}
	}
}

你可能感兴趣的:(后端,java)