zoukankan      html  css  js  c++  java
  • 进程与线程的理解,买火车票的例子

    1.进程:也就是一个应用程序

    2.线程:一个应用程序由多个线程组成,线程是程序运行的最小单元

    3.多线程: 多个线程 同步完成多项任务;

    java中如何实现多线程:

    >第一种方法:

      1.写一个类继承Thread,重写run方法;run方法调用自己的线程

      2.在调用方法之前,启用run方法,调取start方法

    >第二种方法

      1.写一个类实现Runnable接口,重写run方法;run方法调用自己的线程

      2.使用 多线程的地方new Thread(),调取start方法

    在开发中一般使用第二种方法:

      原因:1.如果这个类继承其他的类,第一种方法不使用

         2.第一种方法不能实现数据共享

     数据共享:例子.实现多个窗口买火车票的例子:同时提及一下synchronized关键字

    这里不加synchronized关键字:

    package com.zhiyou.han;
    
    import java.awt.*;
    
    public class ThreadDome1 {
        public static void main(String[] args) {
            Hello hello = new Hello();
            new Thread(hello, "窗口一:").start();
            new Thread(hello, "窗口二:").start();
            new Thread(hello, "窗口三:").start();
        }
    }
    
    class Hello implements Runnable {
        private int pn = 20;
    
        public void show() {
            for (int i = 0; i < 1000; i++) {
                if (pn > 0) {
                    System.out.println(Thread.currentThread().getName() + "===" + pn-- + "=====>" + i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        @Override
        public void run() {
            show();
        }
    }

    打印结果:

     这里加synchronized关键字:

     在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。

      synchronized关键字最主要有以下3种应用方式,下面分别介绍

          修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁

          修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁

          修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
    >加在方法上:只能有一个线程使用??????

    >synchronized这里其实不是加在方法或是代码块中打印结果有问题,而是synchronized加的逻辑位置点,如果把for循环加在run函数里面,再将synchronized修饰其他代码所在的地方,照样可以实现.

    package com.zhiyou.han;
    
    import java.awt.*;
    
    public class ThreadDome1 {
        public static void main(String[] args) {
            Hello hello = new Hello();
            new Thread(hello, "窗口一:").start();
            new Thread(hello, "窗口二:").start();
            new Thread(hello, "窗口三:").start();
        }
    }
    
    class Hello implements Runnable {
        private int pn = 20;
    
        public synchronized void show() {
            for (int i = 0; i < 1000; i++) {
                if (pn > 0) {
                    System.out.println(Thread.currentThread().getName() + "===" + pn-- + "=====>" + i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        @Override
        public void run() {
            show();
        }
    }

    打印结果:

      修饰代码块时:

    package com.zhiyou.han;
    
    import java.awt.*;
    
    public class ThreadDome1 {
        public static void main(String[] args) {
            Hello hello = new Hello();
            new Thread(hello, "窗口一:").start();
            new Thread(hello, "窗口二:").start();
            new Thread(hello, "窗口三:").start();
        }
    }
    
    class Hello implements Runnable {
        private int pn = 20;
    
        public void show() {
            for (int i = 0; i < 1000; i++) {
                if (pn > 0) {
                    synchronized (this){
                        System.out.println(Thread.currentThread().getName() + "===" + pn-- + "=====>" + i);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    
        @Override
        public void run() {
            show();
        }
    }

    打印结果:

  • 相关阅读:
    Mongodb在Linux下的安装和启动和配置
    Java线程--Exchanger使用
    Java线程--Phaser使用
    Java线程--CyclicBarrier使用
    Java线程--CountDownLatch使用
    Java线程状态介绍
    Java8 Stream 的一些操作和介绍
    Java正则
    Linux curl命令进行网络请求
    Netty入门使用教程
  • 原文地址:https://www.cnblogs.com/han-guang-xue/p/9946041.html
Copyright © 2011-2022 走看看