美文网首页
创建线程的四种方式

创建线程的四种方式

作者: 贾歌 | 来源:发表于2017-10-08 21:42 被阅读147次

    首先要明白什么是线程和进程。

    • 进程是什么呢? 进程是计算机中运行的一个应用程序.
    • 线程:执行该进程的逻辑单元. 线程是用来执行进程的.

    创建线程的四种方式:

    1. 继承Thread类,并复写run方法,创建该类对象,调用start方法开启线程。此方式没有返回值。

    2. 实现Runnable接口,复写run方法,创建Thread类对象,将Runnable子类对象传递给Thread类对象。调用start方法开启线程。此方法2较之方法1好,将线程对象和线程任务对象分离开。降低了耦合性,利于维护。此方式没有返回值。

    3. 创建FutureTask对象,创建Callable子类对象,复写call(相当于run)方法,将其传递给FutureTask对象(相当于一个Runnable)。 创建Thread类对象,将FutureTask对象传递给Thread对象。调用start方法开启线程。这种方式可以获得线程执行完之后的返回值。该方法使用Runnable功能更加强大的一个子类.这个子类是具有返回值类型的任务方法。

    4. 线程池

    • 提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。
    • 线程池的体系结构:
      java.util.concurrent.Executor : 负责线程的使用与调度的根接口
      |--**ExecutorService 子接口: 线程池的主要接口
      |--ThreadPoolExecutor 线程池的实现类
      |--ScheduledExecutorService 子接口:负责线程的调度
      |--ScheduledThreadPoolExecutor :继承 ThreadPoolExecutor, 实现 ScheduledExecutorService
    • 工具类 : Executors
      a) ExecutorService newFixedThreadPool() : 创建固定大小的线程池
      b) ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。
      c) ExecutorService newSingleThreadExecutor() : 创建单个线程池。线程池中只有一个线程
      d) ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程,`与ExecutorService 的区别是还可以延迟或定时的执行任务*。
    示例代码:
    import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.TimeUnit;
    
    public class NewThreadDemo {
    
        public static void main(String[] args) throws Exception {
            
            //第一种方式
            Thread t1 = new Thread(){
                @Override
                public void run() {
                    System.out.println("第1种方式:new Thread 1");
                }
            };
            t1.start();
            
            TimeUnit.SECONDS.sleep(1);
            
            //第二种方式
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("第2种方式:new Thread 2");
                }
            });
            t2.start();
    
            TimeUnit.SECONDS.sleep(1);
            
            
            //第三种方式
            FutureTask<String> ft = new FutureTask<>(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    String result = "第3种方式:new Thread 3";
                    return result;
                }
            });
            Thread t3 = new Thread(ft);
            t3.start();
            
            // 线程执行完,才会执行get(),所以FutureTask也可以用于闭锁
            String result = ft.get();
            System.out.println(result);
            
            TimeUnit.SECONDS.sleep(1);
            
             //第四种方式
            ExecutorService pool = Executors.newFixedThreadPool(5);
    
            Future<String> future = pool.submit(new Callable<String>(){
                @Override
                public String call() throws Exception {
                    String result = "第4种方式:new Thread 4";
                    return result;
                }
            });
    
            pool.shutdown();
            System.out.println(future.get());
        }
    }
    

    相关文章

      网友评论

          本文标题:创建线程的四种方式

          本文链接:https://www.haomeiwen.com/subject/kdmyyxtx.html