Java多线程的两种实现方式
多线程的两种实现方式和区别
使用Runnable接口与Thread类对比,解决了单继承定义的局限。
1. Thread类的定义
public class Thread extends object implements Runnable{};
Thread实现了Runnable接口
使用了Ruunable接口比Thread类能更好的描述出数据共享的概念-->多线程访问同一资源的操作.
调用run()方法的核心
用start()方法调用run()方法启动线程
Demo: (每个线程由start()启动)
class MyThread extends Thread{
privateint tickets = 10;
@Override
publicvoid run(){
for(int i = 0; i < 100;i++){
if(this.tickets>0)
System.out.println("tickets: "+ this.tickets--);
}
}
}
publicclass TestDemo_01 {
publicstaticvoid main(String[] args){
MyThread m1 = new MyThread();
MyThread m2 = new MyThread();
MyThread m3 = new MyThread();
m1.start();
m2.start();
m3.start();
}
栈内存 |
M1 |
m2 |
m3 |
堆内存 |
ticket=10 |
ticket=10 |
ticket=10 |
2.利用Runnable接口继承实现
class MyThread implements Runnable{
privateint tickets = 10;
@Override
publicvoid run(){
for(int i = 0; i < 100;i++){
if(this.tickets>0)
System.out.println("tickets: "+ this.tickets--);
}
}
}
publicclass TestDemo_01 {
publicstaticvoid main(String[] args){
MyThread mt = new MyThread();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
三个Thread类对象,占用了一个Thread对象的构造方法
都直接占了同一个MyThread类对象的引用
栈内存 |
mt |
new Thread(mt) |
new Thread(mt) |
new Thread(mt) |
堆内存 |
Tickets=10 |
target |
target |
target |
Thread类是Runnable接口的子类
使用Ruunable接口实现多线程可避免单继承的局限
Runnable接口实现了多线程比Thread更清楚的描述了数据资源共享
取得线程名称,可使用Thread类的方法
·构造方法:public Thread(Runnable target, String name);
·public final void setName(String name);
·public final void getName(String name);
取得线程名字的操作,必须是当前执行的线程名字
Demo :
package www.thread.com;
classMyThread_03implementsRunnable{
@Override
publicvoidrun(){
/*在Thread类里提供了一个方法,取得当前线程对象*/
System.out.println(Thread.currentThread().getName());
}
}
publicclassTestDemo_03{
publicstaticvoidmain(String[]args)throws Exception{
MyThread_03mt = newMyThread_03();
newThread(mt,"线程A").start();
newThread(mt).start();
newThread(mt,"线程B").start();
newThread(mt).start();
newThread(mt).start();
mt.run(); //直接调用run()方法
}
}
在实例化Thread类对象没设名字,则自动设置线程编号,保证每个线程对象不重复
主方法就是一个线程(main线程),所有在主方法是创建的线程都可以是子线程
每使用Java命令去解释一个程序类时,操作系统相当于启动了一个新的进程
而main只是一个新进程的子进程
每一个JVM进程启动时至少启动两个线程
·main线程:线程的主要执行,以及启动子线程
·gc线程:负责垃圾收集