Thread是一个类,它实现了 Runnable 接口,Runnable 是一个接口。
创建线程的方法
- 继承 Thread 类,并重写 run 方法
public class ThreadTest {
public static void main(String[] args) {
PrimeThread p = new PrimeThread(143);
p.start();
}
}
class PrimeThread extends Thread {
long num;
PrimeThread(long num) {
this.num = num;
}
@Override
public void run() {
System.out.println("thread start. num: " + num);
// compute primes larger than minPrime
}
}
- 实现 Runnable 接口
public class ThreadTest {
public static void main(String[] args) {
PrimeRun p = new PrimeRun(143);
new Thread(p).start(); //创建Thread类,并传入构造参数runnable
}
}
class PrimeRun implements Runnable {
long num;
PrimeRun(long num) {
this.num = num;
}
@Override
public void run() {
// compute primes larger than minPrime
System.out.println("thread start. num: " + num);
}
}
两种方式的比较
- Runnable 方式可以避免Thread方式由于Java单继承性带来的缺陷
- Runnable 的代码可以被多个线程(Thread实例)共享,适合于多个线程处理同一资源(即一个Runnable实例可以作为参数传入多个Thread实例)
卖火车票实例
- Thread 方式
class myThread extends Thread{
private int ticketsCount=5;//一种有5张票
private String name;//窗口,也即是线程的名字
public myThread(String name){
this.name=name;
}
@Override
public void run() {
while(ticketsCount>0) {
//如果还有票,就卖掉一张
System.out.println(name+"有"+ticketsCount+"张票,卖了1一张票,剩余票数为:"+ --ticketsCount);
}
}
}
public class ThreadTest {
public static void main(String args[]) {
//创建三个线程,模拟三个窗口卖票
myThread t1=new myThread("窗口1");
myThread t2=new myThread("窗口2");
myThread t3=new myThread("窗口3");
//启动这三个线程,也即是窗口开始卖票
t1.start();
t2.start();
t3.start();
}
}
- Runnable 方式
class myThread_Runnable implements Runnable{
private int ticketsCount=5;//一种有5张票
public void run() {//如果给run方法加锁,那么会出现一个窗口会卖光所有票的现象
while(ticketsCount>0) {
ticketsCount--;//如果还有票,就卖掉一张
System.out.println(Thread.currentThread().getName()+"卖了1一张票,剩余票数为:"+ticketsCount);
}
}
}
public class RunnableTest {
public static void main(String args[]){
myThread_Runnable mt=new myThread_Runnable();
//创建三个线程,来模拟三个售票窗口
Thread t1=new Thread(mt,"窗口1");
Thread t2=new Thread(mt,"窗口2");
Thread t3=new Thread(mt,"窗口3");
//启动这三个线程,也即是三个窗口,开始卖票
t1.start();
t2.start();
t3.start();
}
}