java的多线程学习,第一记

实现多线程有三种方法

1,继承THread类

import com.sun.org.apache.xpath.internal.SourceTree;

public class test{

    //继承Thread类并重写run方法
    public static class MyThread extends Thread{
        @Override
        public void run(){
            System.out.println("I am a child thread");
        }
    }

    public static void main(String[] args) {
        //创建线程
        MyThread thread = new MyThread();
        //启动线程
        thread.start();
    }


}

2,实现Runable接口

public class test1{

    public static class RunableTask implements Runnable{
        private String param;

        @Override
        public void run(){
            System.out.println(param+"I am a child thread");
        }

        public RunableTask(String param){
            this.param = param;
        }

        
    }

    public static void main(String[] args) {
        RunableTask task1 = new RunableTask("21312");
        RunableTask task2 = new RunableTask("123123123");
        new Thread(task1).start();
        new Thread(task2).start();
    }

   

}
 

3,使用FutrueTask方法

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class test2{
    

    public static class CallerTask implements Callable<String>{

        @Override
        public String call()throws Exception{
            return "hello";
        }
    }

    public static void main(String[] args) {
        //create asynchronous task
        FutureTask<String> futureTask = new FutureTask<>(new CallerTask());
        //start thread
        new Thread(futureTask).start();
        try {
            //wait task excute 
            String result = futureTask.get();
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 三种方式的对比优劣:

使用继承方式的好处是,在run()方法内获取当前线程直接使用this就可以了,无须使用Thread.currentThread()方法,不好的地方是Java不支持多线程,如果继承了Thread类,

那么就不能继承其他类了。另外任务与代码没有分离,当多个线程执行一样的任务时需

要多份任务代码,而Runable接口则没有这个限制。

如上面代码所示,两个线程共用一个task代码逻辑,如果需要,可以给RunableTask添加参数

进行任务区分。但是上面两种方式都有一个缺点,就是任务没有返回值。用FutureTask方式是有返回值的

posted @ 2018-11-28 17:39  正能量教官  阅读(125)  评论(0编辑  收藏  举报