• 多线程


    实现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

  • 相关阅读:
    微信公共平台(一)网址接入
    微信公共平台(二)自动回复消息
    Android4.0上的Toast显示太小解决方法
    Android 时间轴
    Node.js开发指南——第3章安装Node.js快速入门(三) 事件
    Node.js开发指南——第3章安装Node.js快速入门(二) 异步式I/O
    Android应用开发实战第二版 demo 基于服务的微博照片分享(修改版)
    android skia decode returned false
    在Myeclipse中查看android源码就是这么easy
    关于android分辨率兼容问题
  • 原文地址:https://www.cnblogs.com/z360519549/p/10620851.html
Copyright © 2020-2023  润新知