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能比较方便的实现资源共享

你可能感兴趣的:(java 多线程 两种实现方式)