进程与线程的理解,买火车票的例子
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(); } }
打印结果:
本文来自博客园踩坑狭,作者:韩若明瞳,转载请注明原文链接:https://www.cnblogs.com/han-guang-xue/p/9946041.html