1.什么是线程
线程是一个单独的执行流,有自己的程序执行计算器和栈。
存在的目的是令程序的指令可以并发执行。
并发执行:两个或多个指令在同一时间间隔内执行。
并发执行的程序可以充分的利用cpu资源:计算机的cpu负责完成对程序的计算任务,执行程序指定的各种指令,但程序本身由指令和数据构成,故而往往需要获取其他的资源后才能配合cpu执行计算任务。
例如:网络IO请求,在等待网络数据获取完毕之前,cpu处于空闲状态,如果程序是顺序执行,此时cpu资源就被浪费了,如果程序是并发执行就可以先执行其他线程了。
2.在java中创建线程
在java中可通过两种方式创建线程。
(1)继承Thread类
public class HelloThread extends Thread {
@Override
public void run(){
try {
Thread.sleep(500);
System.out.println("hello");
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
HelloThread helloThread = new HelloThread();
helloThread.start();
}
//输出:
main
hello
}
对调用了start()方法的线程类程序将启动一个新的线程,与当前存在的线程并发执行。
按顺序执行方式,输出应该是:
hello
main
因为两个线程并发执行run内的语句在输出前等待了0.5秒,所以main比hello更快输出。
ps:只有线程类调用的start()方法才会创建一个新的线程,直接执行run与直接调用普通的方法无异。
(2)实现Runnable接口
如果需要并发执行的类已经继承的其他类,就无法再继承Thread类,此时可以通过实现Runnable接口实现创建线程。
public class HelloRunnable implements Runnable {
@Override
public void run() {
try {
Thread.sleep(500);
System.out.println("hello");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread thread = new Thread(new HelloRunnable());
thread.start();
System.out.println("main");
}
}
ps:一般来说,为减少创建和销毁线程所花费的开销和内存资源浪费,不会自行显式(new一个对象)创建一个线程,而是通过线程池来管理。