线程创建
线程创建有两种方法,extends Thread或者implements Runnable,区别是一个是继承一个是接口。都必须重写run()方法
优级级
public final void setPriority(int newPriority) 设置线程的优先级为 newPriority :
newPriority 的值必须在 MIN_PRIORITY 到MAX_PRIORITY范围内,通常它们的值分别是1和10。
Windows系统只支持3个级别的优先级, 它们分别是Thread.MAX_PRIORITY、 Thread.MIN_PRIORITY和Thread.NORM_PRIORITY。
public final int getPriority() 获得当前线程的优先级。
同步锁
当把一语句块声明为 synchornized,在同一时间,它的访问线程之一才能执行该语句块。
1) 方法同步:用关键字 synchonized 可将方法声明为同步,格式如下
class 类名{
public synchonized 类型名称 方法名称(){
......
}
}
2)语句块同步: 对于同步块,synchornized 获取的是参数中的对象锁
synchornized(obj)
{
//………………….
}
当两个并发线程访问同一个对象的 synchornized(o)同步代码块时,一段时间内只能有一个线程运行。另外的线程必须等到当前线程执行完同步代码块释放锁之后,获得锁的线程将执行同步代码块。
有时可以通过下面的格式声明同步块。
public void method()
{
synchornized(this) //同步块
{
//………………………
}
}
当有一个线程访问某个对象的 synchornized(this)同步代码块时,另外一个线程必须等待该线程执行完此代码块,其他线程可以访问该对象中的非 synchornized(this)同步代码。如果类中包含多个 synchornized(this)同步代码块,如果同步线程有一个访问其中一个代码块,则其他线程不能访问该对象的所有 synchornized(this)同步代码块。对于下面形式的同步块而言,调用 ClassName 对象实例的并行线程中只有一个线程能够访问该对象。
synchornized(ClassName.class)
{
//…………………….
}
sleep与wait
1)这两个方法根本来自不同的类,sleep来自Thread,wait来自Object类。
sleep是Thread提供的一个静态方法,该方法出现在那个线程中,那个线程就"睡觉"(非执行状态),并非是 调用该方法的线程睡觉,例如a线程中调用线程b.sleep(),a线程睡觉。
wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待直到其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。
2)sleep方法没有释放“锁”,而wait方法释放了"锁",不然的话就会形成死锁了。
sleep是不让出系统资源的;wait是线程交互时,如果线程a对一个同步对象x发出一个wait调用该线程会进入线程等待池等待,需要等其他线程调用notify/notifyAll唤醒,或者指定的时间过后自动唤醒。
无论是sleep设置的时间到了,还是wait之后被唤醒了,线程并不一定立即恢复执行,而是触发"操作系统重新进行一次CPU竞争"。
3)两个方法都需要抛出异常。wait()必须放在synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常
4) 使用范围不一样。sleep用于线程控制,而wait用于线程间的通信
synchronized(x){
x.notify()
//或者wait()
}
Java线程
http://blog.csdn.net/hguisu/article/details/7490616
Java Thread(线程)案例详解sleep和wait的区别
http://www.cnblogs.com/DreamSea/archive/2012/01/16/SleepAndWaitDifferent.html