Java多线程实现(Thread类实现多线程)
1 Java.lang.Thread 介绍
Java.lang.Thread是一个线程操作的核心类。
如果现在要想定义一个线程的主类,那么最简单的方式就是直接继承Thread,而后覆写该类中的run()方法(相当于线程的主方法)。
范例:定义线程主题类
Class MyThread extends Thread { // 是一个线程的主体类
Private String title ;
Public MyThread(string title) {
This.title+title ;
}
@Override
Public void run () { //所有的线程从此处开始执行
For (int x=0;x<10;x++) {
System.out.println(this.title + ”,x = ”+ x) ;
}
}
}
Public static void main(String[ ] args) {
MyThread mt1 = new MyThread(“线程A”) ;
MyThread mt2 = new MyThread(“线程B”) ;
MyThread mt3 = new MyThread(“线程C”) ;
mt1.run() ;
mt2.run() ;
mt2.run() ;
}
}
当现在有了线程的主体类之后,很明显首先就一定会想到产生对象随后调用方法,但是现在不能够直接调用run()方法。
范例:观察直接调用run()方法
Public class TestDemo {
Public static void main(String[ ] args) {
MyThread mt1 = new MyThread(“线程A”) ;
MyThread mt2 = new MyThread(“线程B”) ;
MyThread mt3 = new MyThread(“线程C”) ;
mt1.run() ;
mt2.run() ;
mt2.run() ;
}
}
这个时候只是做了一个顺序打印,跟多线程没有关系。多线程的执行实际上和进程是相似的,也应该采用的是多个程序交替执行,而不是说各自执行各自的。
正确启动多线程的方式应该调用的是Thread类start()方法。
- 启动多线程:public void start(),调用此方法会调用run();
范例:正确的启动多线程
Public class TestDemo {
Public static void main(String[ ] args) {
MyThread mt1 = new MyThread(“线程A”) ;
MyThread mt2 = new MyThread(“线程B”) ;
MyThread mt3 = new MyThread(“线程C”) ;
mt1.start( ) ;
mt2.start( ) ;
mt2.start( ) ;
}
}
此时执行代码发现所有的线程对象变为了交替执行。
疑问:为什么要通过start()方法来调用run()方法?而不是run()直接执行?
如果想解决此类问题,就必须打开Java的源代码进行浏览(在JDK的安装目录下;
源代码
Public synchronized void start(){
If(threadstatus !=0)
Throw new IllegalThreadStateException();
Group.add(this);
Boolean started = false;
Try {
Start0();
Started = true;
} finally {
Try {
If (!started) {
Group.threadstartFailed(this);
}
}catch (Throwable ignore) {
}
首先在本程序中发现该方法会抛出一个异常
“IllegalThreadStateException”,如果按照原本的处理方式,这个时候在star()方法上应该使用throws声明,或者直接在方法中进行try…catch处理,而此处不需要处理,所以它是一个RuntimeException的子类。
这个异常的产生只是在你重复启动了多线程才会抛出。所以每一个线程对象只能启动一次。
而后可以发现在start()方法里面调用了一次start0()方法,而这个方法是一个只声明而未实现的方法,同时使用了native关键字进行定义,native指的是调用本机的原生系统函数