线程的创建方式

118 阅读2分钟
1、对于开发者而言,线程并不陌生,其是异步执行,就是不用等程序从上到下一直执行下来,是程序执行的最小单位,
对于进程而言,进程包含线程,每个程序程序都至少有一个线程;
  2、对于Java而言,更是离不开线程,Java将线程定义为几种状态,分别是:
   (1)新建(New):表示线程创建后但是尚未运行,即还没调用start()方法;
   (2)运行(Runnable):表示线程处于就绪状态中或者已经在运行状态中;
   (3)等待(WAITING):处于这种状态的线程,一般被挂起,等待其他线程通知或者唤醒等;
   (4)阻塞(BLOCKED):表示线程阻塞于锁;
   (5)死亡(Terminated):线程已经结束运行,即死亡;
3、Java中,新建一个线程,一般是通过new出一个线程,即指new Therad(),但是创建方式有以下几种,分别是:

(1)继承Thread类:
public class ThreadTest {

 public static void main(String[] args) {
    Hello hello = new Hello();
    Thread thread = new Thread(hello);
    thread.start();

    System.out.println("主程序执行结束");
  }
}

class Hello extends Thread {

@Override
public void run() {
    System.out.println(Thread.currentThread().getName() + "开始执行");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "执行结束");
  }
}

 (2)实现Runnable接口:

public class Hello implements Runnable {


@Override
public void run() {
    System.out.println("线程测试");
    LockSupport.park(this);

    System.out.println("--------------------------");
    System.out.println("线程结束");
}

public static void main(String[] args) {
    Hello hello = new Hello();
    Thread thread = new Thread(hello);
    thread.start();

    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    LockSupport.unpark(thread);

    System.out.println("-----------------执行结束");
  }
}

(3)实现Callable接口: 
   ```
public class ThreadTest {

public static void main(String[] args) throws ExecutionException, InterruptedException {
    FutureTask<String> futureTask = new FutureTask<>(new Hello());
    Thread thread = new Thread(futureTask);
    thread.start();

    futureTask.get();
    System.out.println("主程序执行结束");
 }
}

class Hello implements Callable<String> {

@Override
public String call() throws Exception {
    System.out.println(Thread.currentThread().getName() + "开始执行");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "执行结束");
    return "success";
 }
}
    4、一般来讲,不太推荐继承这种方式,因为Java只能单继承,但是能实现多个接口, 对于Callable而言,
       FutureTask提供多个方法,get()方法可以等待线程执行完,再往下执行,其提供多个方法可以使用,
       例如isDone() 方法判断线程是否已经执行结束(友情提示:线程启动要调用start()方法,而不是
       单独调用run()方法)