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()方法)