在多个线程同时运行时,就存在多个线程之间的调度控制、资源分配等。本节就来讲解线程使用中的一系列控制命令和使用方法

  • 线程的启动start()、join()与停止stop()

  • 线程的休眠sleep()、挂起yield

  • 线程的同步synchronized

  • 线程的同步锁机制:wait()、notify()和notifyAll()


    start()启动线程,当线程创建之后,利用start方法启动线程。此外还可以利用join方法让线程立即执行

    sleep()让当前线程暂停一段时间之后继续执行。sleep()方法的作用是,会使当前的线程暂停执行一定的时间,以给其他线程机会。

    yield()方法与sleep()方法很相似,只是它不能由用户指定线程暂停多长时间。sleep()方法可以使低优先级的线程得到执行的机会,而yield()方法只能使同优先级的线程有执行机会。

    线程的同步synchronized。

        许多线程在执行过程中必须考虑到与其他线程之间共享数据或者协调执行,这就需要同步机制。在Java中每个对象都有一把锁与其对应。JavaJava不提供单独的Lock或者UNLock操作。它由高层的结构隐式实现,来保证操作的对应。

        synchronized与方法连用

public synchronized void funname(){
        //保护方法模块
    }

        一种比较好的办法是,如果某个变量由一个线程赋值,并由别的线程引用或者赋值,那么所有对该变量的访问必须在某个synchronized语句或者synchronized方法内

synchronized(this){
}    //保护代码模块

    有了synchronized关键字,多线程程序的运行结果将变得可以控制。synchronized关键字用于保护共享数据。


线程的同步机制:wait()、notify()、notifyAll()

    在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象锁标志,进入等待状态,并且可以调用notify()或者notifyAll()方法通知正在等待的其他线程。notify()通知的是等待队列中的第一个线程。notifyAll()通知的是等待队列的所有线程。

    在java中提供的wait()和notify()机制如下:

//被线程1调用
synchronized method1(...){
    //访问数据变量
    available = true;
    notify();
}
//被线程2调用
synchronized method2(...){
    while(!available){
    try{
        wait();//等待notify
    }catch(Exceptioin e){
    
    }
    //访问数据变量
    }
}