java 多线程 两种实现方式
java里,实现多线程,有两种方式,一种是继承Thread,一种是实现Runnable接口。
1.继承Thread
1.1定义继承类
class T extends Thread{
private int flag = 30;
@Override
public void run() {
super.run();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0;i<=30;i++){
if(flag>-1){
System.out.println("线程" + Thread.currentThread().getId() +"===== say:" +flag--);
}
}
}
}
1.2直接在main方法调用
public static void main(String[] args) {
T t1 = new T();
T t2 = new T();
t1.start();
t2.start();
}
1.3运行结果
线程9===== say:30
线程8===== say:30
线程8===== say:29
线程8===== say:28
线程8===== say:27
线程8===== say:26
线程8===== say:25
线程8===== say:24
线程8===== say:23
线程8===== say:22
线程8===== say:21
线程8===== say:20
线程8===== say:19
线程8===== say:18
线程8===== say:17
线程8===== say:16
线程8===== say:15
线程8===== say:14
线程8===== say:13
线程8===== say:12
线程8===== say:11
线程8===== say:10
线程8===== say:9
线程8===== say:8
线程8===== say:7
线程8===== say:6
线程8===== say:5
线程8===== say:4
线程8===== say:3
线程8===== say:2
线程8===== say:1
线程8===== say:0
线程9===== say:29
线程9===== say:28
线程9===== say:27
线程9===== say:26
线程9===== say:25
线程9===== say:24
线程9===== say:23
线程9===== say:22
线程9===== say:21
线程9===== say:20
线程9===== say:19
线程9===== say:18
线程9===== say:17
线程9===== say:16
线程9===== say:15
线程9===== say:14
线程9===== say:13
线程9===== say:12
线程9===== say:11
线程9===== say:10
线程9===== say:9
线程9===== say:8
线程9===== say:7
线程9===== say:6
线程9===== say:5
线程9===== say:4
线程9===== say:3
线程9===== say:2
线程9===== say:1
线程9===== say:0
结论1.并不是t1执行完毕,再执行t2(很类似ajax的异步)2.资源不是共享(falg分别被减小)
2.实现Runnable接口
2.1定义实现接口的类
class R implements Runnable{
private int flag = 30;
@Override
public void run() {
for(int i=0;i<=300;i++){
if(flag>-1){
System.out.println("线程" + Thread.currentThread().getId() +"===== say:" +flag--);
}
}
}
}
2.2在main调用线程
R r1 = new R();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r1);
t1.start();
t2.start();
2.3运行结果
线程8===== say:30
线程8===== say:29
线程8===== say:28
线程8===== say:27
线程8===== say:26
线程9===== say:25
线程9===== say:24
线程9===== say:23
线程9===== say:22
线程9===== say:21
线程9===== say:20
线程9===== say:19
线程9===== say:18
线程9===== say:17
线程9===== say:16
线程9===== say:15
线程9===== say:14
线程9===== say:13
线程9===== say:12
线程9===== say:11
线程9===== say:10
线程9===== say:9
线程9===== say:8
线程9===== say:7
线程9===== say:6
线程9===== say:5
线程9===== say:4
线程9===== say:3
线程9===== say:2
线程9===== say:1
线程9===== say:0
结论
1.r1和r2共同执行
2.资源共享(flag被两个线程使用)
在现实工作中,我们肯定是比较多的使用实现runnable接口的方式,因为java是单继承,实现runnable能比较方便的实现资源共享