Java分享笔记:创建多线程 & 线程同步机…
2018-08-17 09:40:35来源:博客园 阅读 ()
[1] 创建多线程的两种方式
1.1 通过继承Thread类创建多线程
1.定义Thread类的子类,重写run()方法,在run()方法体中编写子线程要执行的功能。
2.创建子线程的实例对象,相当于新建了一条子线程。
3.调用子线程的start()方法,子线程启动并执行run()方法中的功能。
1.2 通过实现Runnable接口创建多线程
1.定义一个类,实现Runnable接口,重写run()方法,在run()方法体中编写子线程要执行的功能。
2.创建实现类的对象。
3.调用Thread类的有参构造函数,将上述实现类对象作为形参传入,创建Thread类的对象。该对象相当于一条新线程。
4.调用Thread对象的start()方法,子线程启动并执行run()方法中的功能。
[2] 线程同步机制
当多条线程操作共享数据时,会出现线程安全问题。为了解决这一问题,需要保证不同线程在访问同一数据时保持一定的顺序,即“线程的同步机制”。实现该机制有两种方法:同步代码块,同步方法。前者可以指定任意对象作为监视器,后者只能默认使用当前对象作为监视器。故使用同步方法保证线程同步有一定的局限性。
[3] 代码实例
3.1 通过继承Thread类创建多线程,并使用同步代码块的方式保证线程的同步。
1 //通过继承Thread类的方式创建多线程 2 //多条线程操作同一个共享资源,存在线程安全问题 3 //通过同步代码块的方式使线程同步 4 package pack01; 5 6 //定义子线程 7 class SubThread extends Thread { 8 9 private static int i = 1; 10 static Object lock = new Object(); //创建静态对象作为监视器 11 12 // 子线程要实现的功能:将静态变量i累加到100,并打印每次的累加结果 13 // 由于多条线程会同时操作静态变量i,故需要保证线程的同步 14 public void run() { 15 16 while (true) { 17 18 synchronized (lock) { 19 if (i <= 100) { 20 System.out.println(Thread.currentThread().getName() + "----" + i); 21 ++i; 22 23 } else { 24 break; 25 } 26 } 27 } 28 29 } 30 } 31 32 public class MulThread { 33 public static void main(String[] args) { 34 35 SubThread st1 = new SubThread(); 36 SubThread st2 = new SubThread(); 37 38 // 设置线程名称 39 st1.setName("ONE####"); 40 st2.setName("TWO...."); 41 42 // 启动线程 43 st1.start(); 44 st2.start(); 45 } 46 }
3.2 通过实现Runnable接口创建多线程,使用同步方法保证线程同步。
1 //通过实现Runnable接口的方式创建多线程 2 //多条线程操作同一个共享资源,存在线程安全问题 3 //通过使用同步方法保证线程的同步 4 package pack01; 5 6 class Sub implements Runnable{ 7 8 private static int i=1; //被多条线程共同操作的静态变量 9 10 public void run() { 11 while(true) { 12 printI(); 13 } 14 } 15 16 public synchronized void printI() { //将要需要同步的代码封装进一个同步方法中 17 18 if(i<=100) { 19 System.out.println( Thread.currentThread().getName() + "----" + i ); 20 ++i; 21 } else { 22 System.exit(0); 23 } 24 } 25 } 26 27 public class MulThread2 { 28 public static void main(String[] args) { 29 30 Sub sub = new Sub(); 31 32 Thread t1 = new Thread(sub);//将Runnable接口的实现类对象作为参数,传给Thread构造器 33 Thread t2 = new Thread(sub); 34 35 t1.setName("ONE####"); 36 t2.setName("TWO...."); 37 38 t1.start(); 39 t2.start(); 40 } 41 }
注:希望与各位读者相互交流,共同学习进步。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash