多线程

实现Callable接口 的 call() 方法 可以实现多线程,并且返回call() 方法的执行结果。

public class CallTest  implements Callable<Object>{
    public  Object call() throws Exception {
        try {
            Thread.sleep(500L);
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("这是call 线程");
        return 222;
    }
}
Callable<Object> 也可以写成  Callable<String> 等类型, 返回 的也是 String 。
public class ThreadMain {
    public static void main(String[] args) {
        Callable<Object> callTest = new CallTest();
        FutureTask<Object> fu = new FutureTask<Object>(callTest);
        new Thread(fu).start();
        System.out.println("AA");
        try {
            
            System.out.println(fu.get());
            System.out.println("BB");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println("这是主线程");
    }
}

执行结果:

AA
Thread-0
这是call 线程
222
BB
这是主线程

启动方式:

		Callable<Object> callTest = new CallTest();
		FutureTask<Object> fu = new FutureTask<Object>(callTest);
		new Thread(fu).start();

  如果Callable 泛型是  Callable<String> , 则此处也必须是 FutureTask<String>。

 

fu.get()可以得到线程的返回结果。 如果执行 fu.get() , 则此处必须等待线程执行完。 才会执行后面的语句。

如果不需要执行 fu.get(), 则可以在线程执行前就 执行main 中后面的代码。比如如果把 try 注释掉。则返回:

AA
这是主线程
Thread-0
这是call 线程

 

 

当一个线程把另一个线程执行 interrupt() 中断时,如果另一个线程在运行状态,则 另一个线程只是 isInterrupted() 状态位改成 true ,并不会终止。

 

public class InterruptedDemo implements Runnable{
	public static void main(String[] args) throws InterruptedException {
		Thread threadc = new Thread(new InterruptedDemo(), "InterruptedDemo thread") ;
		System.out.println("starting thread");
		threadc.start();
		
		System.out.println("interrupting thread");
		threadc.interrupt();
		System.out.println("线程是否中断:" + threadc.isInterrupted());

		
		System.out.println("Stopping application");
	}

	@Override
	public void run() {
		boolean stop = false;
		while(!stop) {
			System.out.println("My thread is running");
			long time = System.currentTimeMillis();

			System.out.println("线程是否中断22222:" + Thread.currentThread().isInterrupted());
		}
		System.out.println("线程是否中断3333:" + Thread.currentThread().isInterrupted());
		System.out.println("My thread exiting under request");
	}

}

  输出:

starting thread
interrupting thread
线程是否中断:true
Stopping application
My thread is running
线程是否中断22222:true
My thread is running
线程是否中断22222:true  

线程 threadc 会一直在 while循环中。 

如果在 while 循环中 加上:

if (Thread.currentThread().isInterrupted()) {
  break;
}  则会跳出循环。

 

当执行 threadc.interrupt(); 线程中断位置为真, isInterrupted() 返回true, 处于中断状态的线程 收到中断信号 Thread.sleep(),Object.wait(),Thread.join()等,会抛出InterruptedException,同时会把中断状态置回为false 。

当一个线程处于中断状态时(意思是它的中断状态位为true),如果再由wait、sleep以及jion三个方法引起的阻塞,那么JVM会将线程的中断标志重新设置为false,并抛出一个InterruptedException异常;
package demo.interrupt;

public class InterruptedDemo implements Runnable{
	public static void main(String[] args) throws InterruptedException {
		Thread threadc = new Thread(new InterruptedDemo(), "InterruptedDemo thread") ;
		System.out.println("starting thread");
		threadc.start();
		
		System.out.println("interrupting thread");
		threadc.interrupt();
		System.out.println("线程是否中断:" + threadc.isInterrupted());

		System.out.println("Stopping application");
	}

	@Override
	public void run() {
		boolean stop = false;
		while(!stop) {
			System.out.println("My thread is running");
			long time = System.currentTimeMillis();
              System.out.println("线程是否中断22222:" + Thread.currentThread().isInterrupted());
			try {
				Thread.sleep(3L);
				System.out.println("111");
			} catch (InterruptedException e) {
				System.out.println("222");
				break;
			}
		}
		System.out.println("线程是否中断3333:" + Thread.currentThread().isInterrupted());
		System.out.println("My thread exiting under request");
	}

}

  输出:

starting thread
interrupting thread
线程是否中断:true
Stopping application
My thread is running
线程是否中断22222:true
222                                          // 中断标志置为 true 之后, Thread.sleep(3L); 会抛异常,执行 catch 中的语句。

线程是否中断3333:false
My thread exiting under request

 

public static boolean interrupted():返回线程的上次的中断状态,并清除中断状态

package demo.interrupt;

public class InterruptedDemo implements Runnable{
	public static void main(String[] args) throws InterruptedException {
		Thread threadc = new Thread(new InterruptedDemo(), "InterruptedDemo thread") ;
		System.out.println("starting thread");
		threadc.start();
		
		System.out.println("interrupting thread");
		threadc.interrupt();
		System.out.println("线程interrupted:" + threadc.interrupted());
		System.out.println("线程是否中断:" + threadc.isInterrupted());

		System.out.println("Stopping application");
	}

	@Override
	public void run() {
		boolean stop = false;
		while(!stop) {
			System.out.println("My thread is running");
			long time = System.currentTimeMillis();


			System.out.println("线程是否中断22222:" + Thread.currentThread().isInterrupted());
			System.out.println("线程22222 interrupted:" + Thread.interrupted());

			try {
				Thread.sleep(3L);
				System.out.println("111");
			} catch (InterruptedException e) {
				System.out.println("222");
				break;
			}
		}
		System.out.println("线程是否中断3333:" + Thread.currentThread().isInterrupted());
		System.out.println("My thread exiting under request");
	}

}

  输出:

starting thread
interrupting thread
线程interrupted:false    // interrupted() 方法是 static , 需要用类名调用
线程是否中断:true
My thread is running
Stopping application
线程是否中断22222:true
线程22222 interrupted:true           // 中断状态的线程,执行  interrupted() 后,返回中断状态, 如果 中断状态是 true , 返回true,并清除中断状态
111
My thread is running
线程是否中断22222:false
线程22222 interrupted:false
111

posted @ 2019-03-29 13:59  zhoudingzhao  阅读(112)  评论(0编辑  收藏  举报