JavaSE(五):线程

xiaoxiao2021-02-28  22

一、概念

    线程是一个程序的多个执行路径,执行调度的单位,依托于进程而存在。多进程是指操作系统能同时运行多个任务(程序)。多线程是指在同一程序中有多个顺序流在执行。

   进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。

  线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

二、创建方式

start方法启动线程,run方法是线程执行的动作。

1、继承Thread类

package com.multithread.learning; /** *@functon 多线程学习 */ class Thread1 extends Thread{ private String name; public Thread1(String name) { this.name=name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 : " + i); try { sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); } }

2、实现Runnable接口

/** *@functon 多线程学习 *@author 林炳文 *@time 2015.3.9 */ package com.multithread.runnable; class Thread2 implements Runnable{ private String name; public Thread2(String name) { this.name=name; } @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 : " + i); try { Thread.sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { new Thread(new Thread2("C")).start(); new Thread(new Thread2("D")).start(); } }

三、状态

1、start():启动线程,线程从新建状态->就绪状态,系统会通过分配时间随机运行就绪态线程

2、sleep():睡眠线程,线程从就绪状态(或运行状态)->阻塞状态,时间到后会返回就绪状态

3、wait():挂起线程,线程从就绪状态(或运行状态)->阻塞状态

4、notify()与notifyAll():唤醒线程,通过wait()挂起的线程会从阻塞状态->就绪状态

四、同步和交互

1、线程同步

    即线程安全,是为了防止多个线程访问一个数据对象时,对数据造成的破坏。使用synchronized关键字同步方法或代码。注意避免死锁情况。

2、线程交互

    生产者和消费者问题。使用ObjectnotifynotifyAll唤醒线程,wait是线程无期限睡眠。注意:唤醒和睡眠线程要监视的同一个对象,即synchronized锁住同一对象。

五、线程池

    Executors静态方法创建线程池和ThreadPoolExecutor构造方法创建,一般使用Executors工厂方法,方便使用。类图继承关系

六、Callable线程

带返回结果的线程callable接口:一般在线程池中使用,返回Future 类,其中存在线程运行情况。

七、锁

Condition              

Condition将Object监视器方法(waitnotify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wait-set)。

Lock

Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。

ReadWriteLock                    

ReadWriteLock维护了一对相关的锁定,一个用于只读操作,另一个用于写入操作。

参考:http://www.cnblogs.com/riskyer/p/3263032.html

          https://blog.csdn.net/gf771115/article/details/51682561

转载请注明原文地址: https://www.6miu.com/read-2250306.html

最新回复(0)