祝各位道友念头通达
GitHub Gitee 语雀 打赏

进程与线程的理解,买火车票的例子

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();
    }
}

 

打印结果:

 

posted @ 2018-11-12 13:52  韩若明瞳  阅读(864)  评论(0编辑  收藏  举报