------- android培训、java培训、期待与您交流! ----------
获得一个线程有两种方式,继承Thread类或者实现Runnable接口,然后new Thread(实现Runnable接口的对象);
线程的启动是直接调用start()方法,不能直接调用run()方法,这样不会创建一个新的线程,只是简单的在当前线程中执
行了run()方法,然后结束当前线程。
多线程同步需要用到的关键字是synchronized;同步方法和同步块的共同的锁是 this;静态同步方法和同步块的共同的锁
是使用的锁是 类.class。线程间通讯,其实就是多个线程操作同一个对象。
线程中常用的方法:
thread1.join()的作用是把thread1所对应的线程合并到调用thread1.join()的线程中。join()也可以理解为抢占CPU的执行权,其他
线程碰到jonin()后将会等待,直到线程结束。
yield()方法可以让当前正在运行的线程对象临时暂停,让别的线程运行。
sleep(...)方法可以让当前正在运行的线程进入睡眠状态。
wait():释放资源,释放锁
sleep():释放资源,不释放锁
notify()往往幻想的是线程池中的第一个等待的线程
当出现多个生产者和消费者的时候,要用notifyAll()来唤醒等待的线程
线程中的死锁:
当两个或多个线程持有的锁不相同是就好发生死锁现象,例如:
class Test implements Runnable{
private boolean flag=false;
public Test(boolean flag){
this.flag=flag;
}
public void run(){
if(flag){
synchronized(MyLock.locka){
system.out.println("if locka");
synchronized(MyLock.lockb){
system.out.println("if lockb");
}
}
}else{
synchronized(MyLock.lockb){
system.out.println("else lockb");
synchronized(MyLock.locka){
system.out.println("else locka");
}
}
}
}
}class MyLock{
static Object locka=new Object();
static Object lockb=new Object();
}
public class Threadload {
/**
* @param args
*/
public static void main(String[] args) {
Thread t1=new Thread(new Test(true));
Thread t2=new Thread(new Test(false));
t1.start();
t2.start();
}}
因此我们在编写程序的时候应该避免使用这种现象,必须使用同一把锁才能保证线程之间的同步。