java多线程的操作

Posted 段合江

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程的操作相关的知识,希望对你有一定的参考价值。

上篇博客简单了介绍了Java的多线程的概念,与进程的区别,两种创建方式,状态及获取线程名称等内容。这篇文章接着介绍Java的多线程。主要从一下几方面介绍。

1 线程类的常用方法

1.1 start()

启动线程执行run方法

1.2 Thread.sleep()/sleep(long millis)

当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);

sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。

作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会。

1.3 Thread.yield()

让出CPU的使用权,给其他线程执行机会、让同等优先权的线程运行(但并不保证当前线程会被JVM再次调度、使该线程重新进入Running状态),如果没有同等优先权的线程,那么yield()方法将不会起作用。

1.4  Thread.join()

 强制执行该线程,该线程执行期间,其他线程无法运行,必须等该线程执行完毕后,才能执行其他线程。

1.5  object.wait()

使线程进入到等待池(Waiting Pool)中,同时失去了对象的机锁---暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。

1.6 Object.notify()/notifyAll()

 唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。

1.7Object.wait()和Thread.sleep(long)的区别

1.sleep()方法

sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会。
sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。

2. wait()方法
wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁),其他线程可以访问。
wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。
wiat()必须放在synchronized block中,否则会在program runtime时扔出"java.lang.IllegalMonitorStateException"异常。
 
总结一下:

sleep()睡眠时,保持对象锁,仍然占有该锁。

wait()睡眠时,释放对象锁。

 

2 线程的终止

3 线程的同步问题

 

 

参考:

 

Java多线程看我这一篇就足够了

java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)

Java Thread 总结

 









以上是关于java多线程的操作的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程操作数据库

Java多线程概念简介 多线程中篇

Java多线程(多线程基本操作,多线程安全问题等)

java多线程笔记--Atomic原子操作类

java多线程功力

Java多线程操作