1.java实现多线程的两种方式
1)java类继承Thread类
继承Thread类是实现java多线程的一种方式,但是实际上Thread类本身实现了Runnable接口,它代表了线程的一个实例。
启动线程唯一的方法就是调用Thread类的start()方法,这时候便开启了一个新的线程。然后线程会自动调用run方法,你可以重写run方法,在里面添上自己想要执行的代码。
以下附上代码:
public Mythread extends Thread{
@override
public void run(){
System.out.println("这里面可以写上自己要实现的代码");
}
}
然后在合适的位置启动线程
MyThread myThread = new Mythread();
myThread.start();//run方法会自动执行
2)java类实现Runnable接口
有时候我们经常选择实现Runnable接口来实现多线程,原因是java只支持单继承,如果你的类已经继承了一个其他类,这时候你就要通过实现Runnable接口来实现多线程。
public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("写入自己要执行的代码");
}
}
为了启动线程,你需要实例化一个Thread对象,并将实现了Runnable接口的实例对象(MyThread)传入Thread的构造函数中,再调用start方法开启一个线程。
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
这时候thread类中的run方法就会自动调用你的run方法(也就是你的run方法会自动执行)。
2.多线程中run方法和start方法的区别
1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法
run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。
两种方式的比较 :
实际中往往采用实现Runable接口,一方面因为java只支持单继承,继承了Thread类就无法再继续继承其它类,而且Runable接口只有一个run方法;另一方面通过结果可以看出实现Runable接口才是真正的多线程……