zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    WebClient 非阻塞客户端 RestTemplate 阻塞式客户端
    微服务网关---调用其他微服务
    复习下comparable和comparator以及比较
    关于InitializingBean的用法、应用
    Scheduled(cron = "")
    windows查看进程方法(老是忘只能写了)
    vue 控件component
    vue 过滤器的使用实例
    vue基础
    日志脱敏工具
  • 原文地址:https://www.cnblogs.com/EarthPioneer/p/9492241.html
Copyright © 2011-2022 走看看