在java中可有两种方式实现多线程:
一种是继承Thread类,
一种是实现Runnable接口;
Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。
Thread实现多线程代码如下:
<span style="font-size:18px;"> package org.thread.demo;
class MyThread extends Thread{
private String name;
public MyThread(String name) {
super();
this.name = name;
}
public void run(){
for(int i=0;i<10;i++){
System.out.println("线程开始:"+this.name+",i="+i);
}
}
}
package org.thread.demo;
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
mt1.start();
mt2.start();
}
} </span>
在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。
代码如下:
<span style="font-size:18px;"> package org.runnable.demo;
class MyThread implements Runnable{
private String name;
public MyThread(String name) {
this.name = name;
}
public void run(){
for(int i=0;i<100;i++){
System.out.println("线程开始:"+this.name+",i="+i); }
}
}
</span>
但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。
此时观察Thread类,有一个构造方法:public Thread(Runnable targer)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源):
<span style="font-size:18px;"> package org.runnable.demo;
import org.runnable.demo.MyThread;
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
new Thread(mt1).start();
new Thread(mt2).start();
}
}
</span>
Runnable接口相比继承Thread类有如下好处:
(1)避免点继承的局限,一个类可以继承多个接口。
(2)适合于资源的共享
第一点比较好理解,那第二点又是什么意思呢,还是举例说明:
例子一:
<span style="font-size:18px;">public class ThreadDemo
{
public static void main(String []args)
{
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
}
}
class ThreadTest extends Thread
{
private int count=10;
public void run()
{
while(count>0)
{
System.out.println(Thread.currentThread().getName()+" "+count--);
}
}
} </span>
运行,发现这四个线程对象各自占有各自的资源,并不是同时完成统一任务。
我们可以得出结论:Thread类实际上无法达到资源共享的目的。
例子二:
<span style="font-size:18px;">public class ThreadDemo
{
public static void main(String []args)
{
ThreadTest test=new ThreadTest();
new Thread(test).start();
new Thread(test).start();
new Thread(test).start();
new Thread(test).start();
}
}
class ThreadTest implements Runnable
{
private int count=10;
public void run()
{
while(count>0)
{
System.out.println(Thread.currentThread().getName()+" "+count--);
}
}
}
</span>
运行之后我们发现,这四个线程同共享一个count。
Runnable接口和Thread之间的联系:
public class Thread extends Object implements Runnable
容易看出Thread类是Runnable接口的子类。