线程的创建方式

1.继承Thread类,子类要重写run()方法,如:

public class MyThread  extends Thread{

    /**
     * 线程执行的逻辑体
     */
   @Override
    public void run(){
        for(int i=1;i<=100;i++) {
       //this.getName:获取当前线程名称  System.out.println(this.getName()+"下载了" + i + "%"); } } public static void main(String args[]){ //创建一个线程对象 MyThread myThread = new MyThread(); //启动一个线程 myThread.start(); } }

  *注意:启动线程调用start方法为用异步方式启动线程,如果调用run方法则为同步方式启动线程(普通调用)

2.实现Runnable接口,实现run()方法,如:

public class MyRunnable implements Runnable{
    private String name;
    public MyRunnable (String name) {
        this.name = name;
    }
    @Override
    public void run(){
        for(int i=1;i<=100;i++) {
            //this.getName:获取当前线程名称 
            System.out.println(name+"下载了" + i + "%");
        }
    }
    public static void main(String args[]){
        //创建线程对象
        Thread myThread1 = new Thread(new MyRunnable("爱的供养"));
        Thread myThread2 = new Thread(new MyRunnable("告白气球"));
        //启动线程
        myThread1.start();
        myThread2.start();
    }
}

  以上两种方法只是实现方式不用,核心不变,都是实现run方法

3.实现Callable接口,实现call()方法

public class MyCallable{
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        // 1.执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果
        FutureTask<Integer> result = new FutureTask<>(td);
        new Thread(result).start();
        // 2.接收线程运算后的结果
        Integer sum;
         try {
             //等所有线程执行完,获取值,因此FutureTask 可用于 闭锁
             sum = result.get();
             System.out.println("-----------------------------");
             System.out.println(sum);
         } catch (InterruptedException | ExecutionException e) {
             e.printStackTrace();
         }
      }
 }

 class ThreadDemo implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
       int sum = 0;
       for (int i = 0; i <= 100000; i++) {
            System.out.println(i);
              sum += i;
       }
       return sum;
      }
 }

  *注意:get方法是阻塞的,即:线程无返回结果,get方法会一直等待

4.使用ExecutorService、Callable、Future实现有返回结果的线程

  核心还是实现Callable接口,具体参考有返回值的线程池使用

posted @ 2019-12-13 10:44  小小吸血鬼  阅读(152)  评论(0)    收藏  举报