学习Java的第11天
-
Thread构造器
- Thread():创建新的Thread对象
- Thread(String threadname):创建线程并指定线程实例名
- Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接 口中的run方法
- Thread(Runnable target, String name):创建新的Thread对象
-
线程的生命周期
-
新建 就绪 运行 死亡 运行可能遭遇阻塞 阻塞之后继续就绪
之后再次执行 运行结束后 死亡
-
-
线程的同步:
-
Why:多个线程的执行引起执行结果的不稳定(具体情况是一个线程遭遇阻塞这时其他线程的进入会导致共享数据的操作错误)
-
how:Synchronized (同步机制)
-
同步代码块: synchronized (对象(监视器)){ // 需要被同步的代码; }
-
同步监视器:俗称:锁 要求:多个线程必须使用同一把锁。
-
在实现类创建多线程当中可以考虑用this。
-
在继承类创建多线程用当前类作为锁
- 格式:当前类名.class
-
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(); } }
-