JAVA中创建线程:
JAVA中创建线程的2种方式:
1、 继承Thread类
class MyThread extends Thread{
public void run(){
//这里写上线程的内容
}
public static void main(String[]args){
//使用这个方法启动一个线程
(new MyThread()).start();
}
}
2、 实现Runnable接口
class MyThread implements Runnable{
public void run(){
//这里写上线程的内容
}
public static void main(String[]args){
//使用这个方法启动一个线程
(new Thread(new MyThread())).start();
}
}
继承Thread类还是实现Runnable接口:
1、 鼓励第二种方式,因为Java里面只允许单一继承,但允许实现多个接口。第二个方法更加灵活。
Thread中的run方法调用的是Runnable接口的run方法,Thread和Runnable都实现了run方法。 这种操作模式其实就是代理模式,关于代理模式请自行脑补,或参考http://blog.csdn.net/hll814/article/details/50816203start()方法和run()方法的区别:调用start()方法实现了真正的多线程,而直接调用run()方法仍然是顺序执行
1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的
start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
调用start()方法,因为需要用到CPU的资源,所以每次的运行结果基本是都不一样的
start方法源码:
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0 || this != me)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
private native void start0();
调用的是start0()。并且这个这个方法用了native关键字,此关键字表示调用本地操作系统的函数。因为多线程的实现需要本地操作系统的支持。
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。
主线程可以在子线程结束前结束,并且子线程不受影响,不会因主线程的结束而结束。
多线程的数据同步和防止死锁:
在多线程应用中,考虑不同线程之间的数据同步和防止死锁。当2个或多个线程之间同时等待对方释放资源的时候会形成线程之间的死锁。为防止死锁,需要通过同步来实现线程安全。
请看下一篇。。。