• Java分享笔记:创建多线程 & 线程同步机制


    [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 }

    注:希望与各位读者相互交流,共同学习进步。

  • 相关阅读:
    测试可以自动化,日常工作也可以自动化,autoit帮你搞定!
    工作了几年的IT人想要创业,必看的失败经验
    使用autoit,可以节省您很多时间
    美容院会籍管理,看着简单,其实很复杂
    简历,求职求项目,硕士4年工作经验2年管理经验
    maven+svn+hudson+weblogic构建持续集成环境
    快速开发框架V0.001(免费、100%开源)
    进销存管理系统的设计与实现
    窗体的位置startposition manual
    破解网页文章无法复制方法全集合
  • 原文地址:https://www.cnblogs.com/EarthPioneer/p/9492241.html
Copyright © 2020-2023  润新知