java-多线程2
一、实现多进程的方式2 :避免了类的单继承的不足,且适合多个相同的程序代码去处理同一个资源的情况,把线程同程序的代码和数据分离。
1 package test; 2 3 /* 4 * 实现多多进程的方式2:继承Runnable接口 5 * 步骤: 6 * 1自定义MyRunnable类继承接口Runnable 7 * 2重写run()方法 8 * 3创建MyRunnable类的对象 9 * 4创建Thread对象,并把步骤3的对象作为构造参数传递 10 * */ 11 12 public class Test01{ 13 public static void main(String[] args) { 14 MyRunnable mr=new MyRunnable(); 15 16 Thread t1=new Thread(mr,"进程1"); 17 Thread t2=new Thread(mr,"进程2"); 18 19 t1.start(); 20 t2.start(); 21 22 } 23 }
1 package test; 2 3 public class MyRunnable implements Runnable{ 4 @Override 5 public void run() { 6 // TODO Auto-generated method stub 7 for(int i=0;i<100;i++){ 8 //由于实现接口的方式就不能直接使用Thread的方法getName(),但可以间接使用 9 System.out.println(Thread.currentThread().getName()+":"+i); 10 } 11 } 12 }
二、线程同步
1 package test; 2 3 /* 4 * 加入了延迟后,出现了负数票和相同票 5 * 6 * A:是否多线程环境?是 7 * B:是否有共享数据?是 8 * C:是否有多条语句操作共享数据?是 9 * 10 * 解决方法:把多条语句操作共享数据的代码包为一个整体:让某个线程在执行的时候,别人无法执行 11 * 12 * 同步机制 13 * 14 * 同步代码块: 15 * synchronized(对象){ 16 * 需要被同步的代码 17 * } 18 * */ 19 20 public class MyRunnable implements Runnable { 21 private int tickets = 100; 22 private Object obj=new Object(); 23 @Override 24 public void run() { 25 // TODO Auto-generated method stub 26 while (true) { 27 synchronized (obj) { 28 if (tickets > 0) { 29 try { 30 Thread.sleep(100); 31 } catch (InterruptedException e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } 35 System.out.println(Thread.currentThread().getName() 36 + "正在出售第" + (tickets--) + "张票"); 37 } 38 } 39 40 } 41 } 42 }
1 package test; 2 3 /* 4 * 某电影院目前正在上映电影,共有100张票,有三个窗口售票,设计一个程序模拟该电影院售票 5 * */ 6 7 public class Test01{ 8 public static void main(String[] args) { 9 //创建资源对象 10 MyRunnable mr=new MyRunnable(); 11 12 //创建三个线程对象 13 Thread t1=new Thread(mr,"窗口1"); 14 Thread t2=new Thread(mr,"窗口2"); 15 Thread t3=new Thread(mr,"窗口3"); 16 //启动线程 17 t1.start(); 18 t2.start(); 19 t3.start(); 20 21 } 22 }
线程同步:
1前提:多个线程、同一把锁
2好处:解决了多线程的安全问题
3弊病:降低了效率
三、同步方法
1 package test; 2 3 /* 4 * A:同步代码块:任意的对象作为锁 5 * 6 * B:同步方法的格式:把同步关键字放到方法声明上 7 * 同步方法的锁对象是:this 8 * 9 * C:静态方法:锁子是当前类的对象 MyRunnable.class 10 * 11 * */ 12 13 public class MyRunnable implements Runnable { 14 private int tickets = 100; 15 private Object obj = new Object(); 16 private int x = 0; 17 18 @Override 19 public void run() { 20 // TODO Auto-generated method stub 21 while (true) { 22 if (x % 2 == 0) { 23 synchronized (this) { 24 if (tickets > 0) { 25 try { 26 Thread.sleep(100); 27 } catch (InterruptedException e) { 28 // TODO Auto-generated catch block 29 e.printStackTrace(); 30 } 31 System.out.println(Thread.currentThread().getName() 32 + "正在出售第" + (tickets--) + "张票"); 33 } 34 } 35 } else { 36 sellTickets(); 37 } 38 } 39 } 40 41 private synchronized void sellTickets() { 42 if (tickets > 0) { 43 try { 44 Thread.sleep(100); 45 } catch (InterruptedException e) { 46 // TODO Auto-generated catch block 47 e.printStackTrace(); 48 } 49 System.out.println(Thread.currentThread().getName() + "正在出售第" 50 + (tickets--) + "张票"); 51 } 52 } 53 }
1 package test; 2 3 /* 4 * 某电影院目前正在上映电影,共有100张票,有三个窗口售票,设计一个程序模拟该电影院售票 5 * */ 6 7 public class Test01{ 8 public static void main(String[] args) { 9 //创建资源对象 10 MyRunnable mr=new MyRunnable(); 11 12 //创建三个线程对象 13 Thread t1=new Thread(mr,"窗口1"); 14 Thread t2=new Thread(mr,"窗口2"); 15 Thread t3=new Thread(mr,"窗口3"); 16 //启动线程 17 t1.start(); 18 t2.start(); 19 t3.start(); 20 21 } 22 }