线程是在操作系统中是一个非常常见的词
线程具有非常多的进程所具有的特征,所以又称为轻型进程或进程元,相应的把传统进程称为重型进程,传统进程相当于只有线程的任务,引入了线程的OS中通常一个进程拥有若干个线程,至少也有一个线程。
线程的状态有以下几种:执行状态,表示线程正获得处理机儿运行;就需状态,指线程已具备了各种执行状态条件,一旦获得CPU便可执行的状态;阻塞状态,指线程在执行中因某事儿受阻,处于暂停执行的状态。
几乎每一种语言都对多线程提供了支持,当然java也不例外。
一:创建 在java中线程的创建有两种方法:①继承Thread类;②实现Runnable接口
首先说一些这两种实现方式的区别:
①Thread类在API中的定义是这样的,public class Thread extends Object implements Runnable
可以看到,Thread类是实现了Runnable接口的,Runnable接口中只有一个方法,就是public void run(){}这个方法,而在Thread里面有很多的方法,除了重写了run方法之外还有四个构造方法,public void start(){}等方法。
这就说明这个线程类比这个接口更多的关于线程的操作。
②当我们需要实现一个线程的时候,但恰恰这个时候它已经有了一个父类,由于java是单继承的,所以我们不能再继承一个Thread类了,这个时候就只好实现Runable接口了。
③当我们定义了一个实现了Runable接口的类的对象的时候,我们可以开启多个线程,而实现了Thread类的对象就不行了(它只能调用start方法一次)。
二:执行
需要说明的是:在每一个j2SE程序中自始自终都至少运行着两个线程,他们分别是main线程,也就是主线程,还有一个是垃圾回收器线程。
在java中,线程的执行是通过调用start方法来执行的,并不是run方法,start方法在Thread类中定义了,假设我们直接调用run方法,这个时候只是把他当做一个普通的方法来调用了,并没有启动线程。由start方法来调用run方法。
线程的执行是非常随机性的,如果有多个线程存在调用了start方法只是让它在线程队列中等待,并不一定会马上执行,在线程的世界里没有按程序顺序执行这一说。
public class TestThread {
public static void main(String[] args) {
test a=new test("A");
test b=new test("B");
test c=new test("C");
a.start();
b.start();
c.start();
}
}
class test extends Thread{
private String name;
public test(String str){
this.name=str;
}
public void run(){
System.out.println("我是线程:"+name);
}
}
运行之后出现了很多个结果,并不是想象中的ABC.