多线程的两种实现方法(Runnable接口和Thread类)

方式一:实现Runnable接口

1,自定义多线程类,并实现Runnable接口

2,添加父接口中未实现的run()方法,run()方法里面放着的是我们的业务代码

3,创建自定义对象,只创建一次,作为业务对象存在

4,创建对个Thread线程类对象,并且将业务对象交给线程对象来完成

5,以多线程的方式启动多个线程对象

优点:自定义线程只是实现了Runnable接口,后续还可以继承其他类,

 

package cn.tedu.thread;
public class TestRunnableV2 {
public static void main(String[] args) {
TicketsRunnableV2 target=new TicketsRunnableV2();
Thread t1=new Thread(target);
Thread t2=new Thread(target);
Thread t3=new Thread(target);
Thread t4=new Thread(target);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
/*
同步锁:
相当于给容易出现问题的代码加了一把锁,包裹了所有可能会出现数据安全问题的代码加锁之后,
就有了同步(排队)的效果,但是加锁的范围需要考虑
不能太大:太大效率低下
不能太小:出现数据安全问题
*/
class TicketsRunnableV2 implements Runnable{
int tickets=100;
@Override
public void run() {
while (true){
/*
同步代码块:synchronizde(锁对象){会出现安全隐患的所有代码}
在同步代码块中的代码,同一时刻只会被一个线程执行
注意:同步代码块必须保证所有线程对象使用同一一把唯一的锁
*/
synchronized (TicketsRunnableV2.class) {//同步锁的唯一性
if(tickets>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "==" + tickets--);
}
if (tickets <= 0) break;
}
}
}
}
上一篇:log4net详解(转载)


下一篇:java中的多线程:线程使用,人生转折!