栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 多线程基础知识

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 多线程基础知识

Java 多线程 1.创建多线程的三种方式
线程任务的获取方式:
 *   1、继承Thread 重写run
 *     Thread t = new 继承类()
 *     t.start()
 *   2、实现Runnable 重写run方法
 *     Runnable r = new Runnable()
 *     Thread t = new Thread(r);
 *     t.start()
 *   3、实现Callable 重写call方法 可以有返回值
 *     FutureTask task = new FutureTask(Callable);
 *     Thread t = new Thread(task);
 *     t.start();
 *    阻塞方法:等待线程任务执行完毕之后,才会有返回值
 *     T t = task.get();
2.线程的常用方法和基础知识 2.1进程和线程
进程:是一段正在执行的程序。

线程:一个进程中执行中的每个任务为一个线程。

进程包含线程,进程中可包含多个线程,一个线程只属于一个进程。
2.2线程状态
生命周期:

1.新建状态:新建一个线程对象

2.就绪状态:就绪状态除了CPU资源未获得,其他资源已经全部获得,该线程位于“可运行线程池”中。

3.运行状态:就绪状态获取了CPU的资源,执行程序代码。

4.阻塞状态:因某种原因放弃了CPU的使用权,阻塞可分为三种:

(1)、等待阻塞:执行wait()方法,该线程会释放占用的所有资源,只能调用notify()和notifyAll方法才能被唤醒。

(2)、同步阻塞:运行的线程获取对象的同步锁时,该锁被占用,则JVM把该线程放入“锁池”中。

(3)、同步阻塞:在执行sleep()或join()方法,或者发出I/o请求时会进入阻塞状态。

5、死亡状态“线程执行完或因异常退出run()方法,该线程结束生命周期。
2.3线程常用方法 2.3.1 Thread静态方法:
sleep():休眠
currentThread():获取执行当前任务的线程
interrupted():中断当前执行的线程
2.3.2常用方法
		getName():获取线程名  main Thread-0
 *     setName():设置线程名
 *     isAlive():判断线程是否还活着
 *     isInterrupt():判断是否中断
 *     isDeame():判断线程是否是一个守护线程
 *     setDeame():设置一条线程为守护线程
 *     getId():获取线程的唯一标识
 *     getPriority():获取线程的优先级 5
 *     setPriority():设置线程的优先级 MIN_PRIORITY MAX_PRIORITY NORM_PRIORITY
 *     interrupt():中断线程
 	join():让线程进入等待状态,等到其他线程执行完毕之后,该线程在执行。
 	static yeild():	释放当前获取到的CPU时间片,模拟CPU的切换。
 	interrupt():A中调用B的interrupt,打断B的休眠状态。

3 如何解决线程安全问题?有几种方式?
方式一:同步代码块
 synchronized(同步监视器): 在同一时刻只能有一个线程访问,自动释放同步监视器
说明:1.操作共享数据的代码,即为需要被同步的代码
	 2.共享数据:多个线程共同操作的变量。
	 3.同步监视器,俗称:锁。任何一个类的对象的,都可以充当锁。
	要求:多个线程必须用同一个锁
	在实现Runnable接口创建多线程的方式中,可以考虑使用this来充当同步监视器
方式二:同步方法
说明:1.同步方法仍然涉及到同步监视器,只是不需要我们显示的声明。
	 2. 非静态的同步方法,同步监视器是:this。
	 3. 静态的同步方法,同步监视器是:当前类本身。
方式三:Lock锁 ---JDK5.0新增 Lock需要手动启动同步(Lock(),在finally中同时结束同步也需要手动的实现调用unlock())
方式四:线程池
4 线程通信涉及到的三个方法

wait():一旦执行此方法,当前线程进入挂起状态,并释放同步监视器。

notify():一旦执行此方法,就会唤醒wait的一个线程,如果有多个线程wait,唤醒优先级较高的 个。

notifyAll():一旦执行此方法,就会唤醒所有被wait的线程。

说明:

  1. 三个方法必须使用在同步代码块或者同步方法中。

  2. 调用者必须是同步代码块或者同步方法中的同步监视器。否者会发生IllegalMonitorStataException异常

  3. 三个方法是定义在Java.lang.Object中

5 sleep()和wait()的异同?

1.相同点:一旦执行此方法,都可以使得当前的线程进入阻塞状态。

2.不同点:1)两个方法的声明位置不同,Thread类中声明sleep(),Object类中声明wait()

2)调用的要求不同,sleep()可以在任何需要的场景下调用,wait()必须使用在同步代码块或同步方法中。

3)关于是否释放同步监视器,如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁。

6 锁和死锁 6.1 临界资源

多条线程能够同时访问的资源,就叫临界资源,多个线程访问临界资源,对临界资源就有安全隐患

6.2 锁

synchronized 加锁是为了解决线程的安全问题

加锁部分的代码,同一时刻只允许一条线程访问

锁对象的选择:

* 只要能满足临界资源的安全性,锁的对象越小,效率越高

* 锁代码段,锁的范围也是越小约好,只有对临界资源有争抢的部分,锁住即可

6.3 互斥锁

加锁的代码段中同一时刻只允许一条线程访问,互斥锁在操作同一个对象时,有多把锁就形成互斥锁

6.4死锁

线程之间互相抢占资源,变成了等待状态,就形成了死锁。

7 线程池 7.1什么是线程池

线程池是为了对线程对象的复用

Executors:用于创建线程池

ExecutorService:用于管理线程池

7.2创建线程池的四种方式

1、创建线程池的方法:

  •  	创建固定大小的线程池
    
  •  	Executors.newFixedThreadPool(5);
    
  •  	启动Callable任务FutureTask
    

2、根据需求创建线程缓存:

  • Executors.newCachedThreadPool();
  • 并发量大的时候,创建线程的条数就根据缓存创建
  • 把长久不用的线程回收

3、单线程
ExecutorService pool2 = Executors.newSingleThreadExecutor();

4、任务 第一次执行任务的时间 时间间隔 周期任务(线程池中那条线程空闲就执行那条线程执行任务)
pool3.scheduleAtFixedRate(new Runnable()

代码:

public class Demo2 {
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
pool.shutdown();
ExecutorService pool2 = Executors.newSingleThreadExecutor();
// pool2.execute(command);
// pool2.submit(task);
pool2.shutdown();
//延迟支持Callable,延迟的时间,时间单位
ScheduledExecutorService pool3 = Executors.newScheduledThreadPool(3);
pool3.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"hello");
}
}, 3, TimeUnit.SECONDS);
``

	//任务 第一次执行任务的时间  时间间隔 周期任务(线程池中那条线程空闲就执行那条线程执行任务)
	pool3.scheduleAtFixedRate(new Runnable(){
		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()+":HelloWorld");
		}
	}, 3, 2, TimeUnit.SECONDS);
}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324897.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号