zoukankan      html  css  js  c++  java
  • Thread 创建的三种方式

    转载自 https://blog.csdn.net/hellorichen/article/details/53127719

    Java中创建线程主要有三种方式:

    一、继承Thread类创建线程类

    ①定义Thread类的子类,并重写run方法。

    ②创建Thread子类的实例。

    ③调用start()方法。

    访问当前线程:Thread.currentThread().

    二、通过Runnable接口创建线程类

    同上,只是改为定义runnable接口的实现类。

    启动 new Thread(Runnable r,String name).start();

    例:

     1 new Thread(new Run(),"r1").start(); 

    Run为Runnable接口的实现类。或者写为:

     1 package thread;
     2  
     3 public class Main {
     4     public static void main(String[] args) {
     5         new Thread(new Runnable(){
     6             @Override
     7             public void run() {
     8                 System.out.println("run()");
     9             }},"r1").start();
    10     }
    11 }

    接口不可实例化,所以参数必须为实现接口的类或匿名类。

    三、通过Callable和FutureTask创建线程

    ①创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

     1 package thread;
     2  
     3 import java.util.concurrent.Callable;
     4  
     5 public class MyCallable implements Callable<Integer>{
     6     @Override
     7     public Integer call() throws Exception {
     8         // TODO Auto-generated method stub
     9         return 1111;
    10     }
    11  
    12 }

    ②创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

    ③使用FutureTask对象作为Thread对象的target创建并启动新线程,FutureTask是Runnable的子类

    ④调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

     1 package thread;
     2  
     3 import java.util.concurrent.ExecutionException;
     4 import java.util.concurrent.FutureTask;
     5  
     6 public class Main{
     7     public static void main(String[] args) {
     8         FutureTask<Integer> ft = new FutureTask<>(new MyCallable());
     9         new Thread(ft).start();
    10         try {
    11             System.out.println(ft.get());
    12         } catch (InterruptedException e) {
    13             // TODO Auto-generated catch block
    14             e.printStackTrace();
    15         } catch (ExecutionException e) {
    16             // TODO Auto-generated catch block
    17             e.printStackTrace();
    18         }
    19     }
    20 }

    使用接口实现线程的好处:

    多个线程可共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

  • 相关阅读:
    golang垃圾回收和SetFinalizer
    读《我编程,我快乐--程序员职业规划之道》
    golang cache--go-cache
    golang web framework--Martini
    golang http proxy反向代理
    php 设计模式之简单工厂模式
    php 设计模式之责任链模式
    什么是反向索引
    ip地址二进制转十进制
    架构师之路
  • 原文地址:https://www.cnblogs.com/toUpdating/p/10035620.html
Copyright © 2011-2022 走看看