1、多线程中start()和run()方法的区别
1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
2、两者区别与实现方法
实现Thread
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
mt1.start();
mt2.start();
实现Runnable
Runnable里面没有start方法可以通过Thread类进行启动Runnable多线程
Runnable可以用的同一个对象实例化的,可以资源共享,Thread不可以
MyThread实现runnable接口
MyThread mt=new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
用runnable启动一个线程
Test impelements Runnable;//定义线程类
Test t = new Test();//
//由此行代替前面两行
Runnable t=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
};
Thread test = new Thread(t);
test.start();
runnable的好处:
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享
3、卖票例子:
Thread方法实现
package Test1;
class MyThread extends Thread{
private int ticket = 10;
private String name;
public MyThread(String name){
this.name =name;
}
public void run(){
for(int i =0;i<500;i++){
if(this.ticket>0){
System.out.println(this.name+"卖票---->"+(this.ticket--));
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread mt1= new MyThread("一号窗口");
MyThread mt2= new MyThread("二号窗口");
MyThread mt3= new MyThread("三号窗口");
mt1.start();
mt2.start();
mt3.start();
}
}
运行结果
Runnable方法实现
public class Test1 implements Runnable{
private int ticket = 10;
@Override
public void run() {
for(int i =0;i<10;i++){
//添加同步快
synchronized (this){
if(this.ticket>0){
try {
//通过睡眠线程来模拟出最后一张票的抢票场景
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] arg){
Test1 t1 = new Test1();
new Thread(t1, "线程1").start();
new Thread(t1, "线程2").start();
}
}
加上synchronized