标签:
线程的创建有两种方式
1 package learn.JavaBasics.Class; 2 3 public class ThreadDemo extends Thread { 4 private static int count = 1; 5 6 public void run() { 7 System.out.println("Thread: "+count+" has started"); 8 ++count; 9 } 10 11 /** 12 * @param args 13 */ 14 public static void main(String[] args) { 15 // TODO Auto-generated method stub 16 ThreadDemo t1 = new ThreadDemo(); 17 ThreadDemo t2 = new ThreadDemo(); 18 ThreadDemo t3 = new ThreadDemo(); 19 20 new Thread(new Runnable() { 21 22 @Override 23 public void run() { 24 // TODO Auto-generated method stub 25 System.out.println("Runnable Thread has started"); 26 } 27 28 }).start(); 29 30 t1.start(); 31 t2.start(); 32 t3.start(); 33 } 34 }
线程同步
由于一个线程在操作共享数据时,在未执行完毕的情况下,另外的线程也参与进来,导致共享数据存在了安全问题
解决方式:
1. 同步代码块
synchronized(同步监视器) {
//操作共享数据的代码
}
同步监视器, 由任何一个类的对象来充当,哪个线程获得了监视器,哪个线程才可操作共享数据,俗称:锁
所有线程必须同用一个同步监视器, 即这个类的对象只能有一个(接口的形式使用this大体无碍,继承的方式可能会存在多个对象,慎用this)
2. 同步方法
可以相似的理解为此时的同步监视器是这个函数
线程通信
1 package learn.JavaBasics.Class; 2 3 class PrintNum implements Runnable{ 4 private int num = 1; 5 6 @Override 7 public void run() { 8 // TODO Auto-generated method stub 9 while(num <= 100) { 10 synchronized (this) { 11 notify(); //唤醒一个顶部的wait的线程 12 try { 13 Thread.currentThread().sleep(10); 14 } catch (InterruptedException e) { 15 // TODO Auto-generated catch block 16 e.printStackTrace(); 17 } 18 System.out.println(Thread.currentThread().getName() + ":" + num); 19 ++num; 20 21 try { 22 wait();//把本线程wait掉 23 } catch (InterruptedException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } 27 } 28 } 29 } 30 } 31 32 public class TestCommunication { 33 /** 34 * 交替打印1到100的数值 35 */ 36 public static void main(String[] args) { 37 // TODO Auto-generated method stub 38 PrintNum p = new PrintNum(); 39 40 Thread t1 = new Thread(p); 41 Thread t2 = new Thread(p); 42 43 t1.setName("A"); 44 t2.setName("B"); 45 46 t1.start(); 47 t2.start(); 48 } 49 }
标签:
原文地址:http://www.cnblogs.com/hangtt/p/4854409.html