标签:ati 其他 需要 必须 trace new 同步机制 stat lan
Thread构造器
线程的生命周期
新建 就绪 运行 死亡 运行可能遭遇阻塞 阻塞之后继续就绪
之后再次执行 运行结束后 死亡
线程的同步:
Why:多个线程的执行引起执行结果的不稳定(具体情况是一个线程遭遇阻塞这时其他线程的进入会导致共享数据的操作错误)
how:Synchronized (同步机制)
同步代码块: synchronized (对象(监视器)){ // 需要被同步的代码; }
同步监视器:俗称:锁 要求:多个线程必须使用同一把锁。
在实现类创建多线程当中可以考虑用this。
在继承类创建多线程用当前类作为锁
synchronized还可以放在方法声明中,表示整个方法为同步方法。 例如: public synchronized void show (String name){ …. }
//回忆一下实现类的方法创建线程
class MyThread implements Runnable {
private int ticket = 10000;
//多线程真的很恶心 居然运行结果不一样 出不了其它线程买票
//后来改到10000出现了 应该是我cpu太强了吧
//实现接口 重写方法
@Override
public void run() {
while (true) {
synchronized (SellTicket.class) {
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "票号:" + ticket);
ticket--;
}else
break;
}
}
}
}
public class SellTicket {
public static void main(String[] args) {
MyThread s1 = new MyThread();
//将实现接口类的对象当作Thread构造器的参数
Thread t1 = new Thread(s1);
Thread t2 = new Thread(s1);
Thread t3 = new Thread(s1);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t2.start();
t1.start();
t3.start();
}
}
关于同步方法:
同步方法仍然涉及到同步监视器 只是不需要我们显示的声明
非静态的同步方法,同步监视器是this
静态同步方法是当前类本身
class MyThread2 implements Runnable {
private static int ticket = 10000;
@Override
public void run() {
while (true){
show();
}
}
public synchronized static void show() {
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "票号:" + ticket);
ticket--;
}
}
}
public class SynMethod {
public static void main(String[] args) {
MyThread2 m1 = new MyThread2();
Thread t1 = new Thread(m1);
Thread t2 = new Thread(m1);
Thread t3 = new Thread(m1);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t2.start();
t1.start();
t3.start();
}
}
标签:ati 其他 需要 必须 trace new 同步机制 stat lan
原文地址:https://www.cnblogs.com/wumingzhibei/p/12570075.html