线程:
1.同步:synchronized.
public class ts{
public static void main(String[] args){
tik k=new tik();
new Thread(ok).start();
new Thread(ok).start();
new Thread(ok).start();
new Thread(ok).start();
}
}
class tik implements Runnable{
int t=100;
public void run(){
while(true){
if(t>0){
try{
Thread.sleep(10);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(Thead.currentThead().getName()+t);
t--;
}
}
}
}
这段代码使得打出的结果出现负数,原因是因为时间片的缘故。也就是说当t=0的时候,由于睡了10毫秒,但在睡的期间,t=0的时间片轮完了,t=-1就接着来执行,直到t=0醒了执行完它的流程之后才停止循环。因此t就出现了-1,-2这样的情况。
因此,我们用同步synchronized来解决这个问题。同步机制是给定义的对象加一个“锁”,一定要等到循环的上一个执行完它的任务之后,才打开这个“锁”来进行下一步的循环。也就是在t=1执行之前就给对象o加了锁,一定要等t=1醒了执行完它的任务后才能进行t=0的循环,直到循环结束。
package ts;
public class ts {
public static void main(String[] args) {
tik k = new tik();
new Thread(ok).start();
new Thread(ok).start();
new Thread(ok).start();
new Thread(ok).start();
}
}
class tik implements Runnable {
int t = 100;
Object o = new Object(); //定义一个任意类型的对象
public void run() {
while (true) {
synchronized (o) { //将要同步的代码段放入synchronized ()中,o是对象
if (t > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + t);
t--;
}
}
}
}
}
2.以上是同步块,还有一种同步的方法,就是定义同步方法。
package ts;
public class ts {
public static void main(String[] args) {
tik k = new tik();
new Thread(ok).start();
new Thread(ok).start();
new Thread(ok).start();
new Thread(ok).start();
}
}
class tik implements Runnable {
int t = 100;
public void run() {
while (true) {
sell(); //调用方法
}
}
public synchronized void sell(){ //用关键字synchronized定义方法,同步方法也有锁,它的加锁对象是一个this
if (t > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + t);
t--;
}
}
}
3.两个容易造成死锁的Thead方法--rusume()和suspend()
4.Object方法:wait()和notify(),notifyAll()。一个对象有一个锁外,还有一个等待队列。刚创建一个对象的时候,它的等待队列是空的,应该在锁住一个对象后,调用wait()方法,这个方法要抛出异常。notify()则删去队列中任意一个线程,使之可再运行。他们只能在同步中运用。
5.停止线程:interrupt()