多线程—单例设计模式--懒汉式: class Single { private Single(){}; prvate static Single s=null; public static Single getInstance() { If(s==null) { Synchronized(Single.class) { If(s==null) S=new Single(); } } return s; } } 死锁:同步中嵌套同步。 class Ticket implements Runnable { private int tick=500; Object obj =new Object(); boolean flag=true; public void run() { if(flag) { while(true) { synchronized(obj) { show(); } } } else { while(true) show(); } }
public synchronized void show() { synchronized(obj) { if(tick >0) { try{Thread.sleep(10);}catch(Exception e){} System.out.println(Thread.currentThread().getName()+" code: "+tick--); } } } } class DeadLockDemo { public static void main(String[] args) { Ticket t =new Ticket();
Thread t1=new Thread (t);// Thread t2=new Thread (t);//
t1.start(); try{Thread.sleep(10);}catch(Exception e){} t.flag=false; t2.start(); } } 线程间通讯: 其实就是多个线程在操作同一个资源,但是操作的动作不同。 wait(); notify(); notifyAll(); 都使用在同步中,因为要对持有监视器(锁)的线程操作。 所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义在Object类中呢? 因为这些方法在操作同步中线程时,都必须要标识它们所操作的线程持有的锁。 只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。 不可以对不同锁中的线程进行唤醒。 也就是说,等待和唤醒必须是同一个锁。 而锁可以是任意对象,所以可以被任意对象调用的方法定义在object类中。 停止线程: stop方法已经过时。 如何停止线程? 只有一种,run方法结束。 开启多线程运行,运行代码通常是循环结构。 只要控制住循环,就可以让run方法结束,也就是线程结束。 特殊情况: 当线程处于了冻结状态, 就不会读取到标记,那么线程就不会结束。 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。 强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。 Thread类提供了该方法 interrupt()。 join方法: 当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。 join可以用来临时加入线程执行。 class Demo implements Runnable { public void run()//synchronized { for(int x=0;x<70;x++) { System.out.println(Thread.currentThread().toString()+"....."+x); Thread.yield(); }
} } class JoinDemo { public static void main(String[] args) throws Exception { Demo d=new Demo();
Thread t1=new Thread(d); Thread t2=new Thread(d);
t1.start(); t2.start(); t1.join(); for(int x=0;x<80;x++) { System.out.println(Thread.currentThread().toString()+"....."+x); }
System.out.println("over"); } } 线程优先级共10级,1到10级,默认是5; 当数据是固定的,定义为常量 数据共享的,定义为静态。 |