线程
创建线程方式
一:继承方式
1. class 子线程类 extends Thread{
run(){
任务代码
}
}
2.子线程类 t = new 子线程类();
3.t.start();
二:实现方式
1. class 实现类 implements Runnable{
run(){
任务代码
}
}
2. Thread t = new Thread(new 实现类());
3.t.start();
从耦合性分析:
第一种方式:线程和任务是紧紧联系在一起的,耦合性高
第二种方式:线程是线程,任务是任务,他们之间没有必然联系,给一个线程传递哪个任务那么该线程就执行哪个任务
所以说开发中,我们用第二种方式
从代码的扩展性:
第一种方式 由于是继承Thread,那么子线程类就不能继承别的类
第二种方式 由于是实现了接口,同时可以继承别的类
//1.第一种方式创建线程对象:继承方式
new Thread(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("线程"+getName()+i);
}
}
}.start();
//2.第二种方式创建线程对象:实现方式
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
System.out.println("线程"+Thread.currentThread().getName()+i);
}
}
}).start();
三种解决安全问题的方式:
1,同步锁(同步代码块)
格式: synchronized(锁对象){
要同步的那些代码
}
2,同步方法:
格式:public synchronized void 方法名(){
要同步的那些代码
}
同步方法和同步锁,原理是一样,同步方法用的锁对象是this对象
如果同步方式是静态的,那么同步方法用的锁对象是 当前类.class
3,Lock接口
l.lock();
要同步的那些代码
l.unlock();