深入java多线程一

涉及到

1.线程的启动(start)

2.线程的暂停(suspend()和resume())

3.线程的停止(interrupt与异常停止,interrupt与睡眠中停止,stop(),return)

4.线程的优先级(setPriority())

5.线程安全相关的问题(同步加锁,守护线程)

一.线程与进程

(1) 进程是受操作系统管理的基本运行单位(查看windows的任务管理器的进程更好理解)

(2) 线程可以理解为是在进程中独立运行的子任务

单线程与多线程,前者的特点是排队执行,也就是同步,CPU利用率大幅度降低,后者是在不同的任务间来回切换,切换速度快,使得看起来是在同一时间内运行很多不同种类的任务,多线程就等于异步.

二.使用多线程

(1) 多线程的实现方式(两种):

a.继承Thread类

b.实现Runnable接口

他们之间存在多态关系,查看源码可以看出Thread类其实也是实现了Runnable接口,也就是说这两种方式创建的线程在工作的时候性质是一样的,这也就是说使用Runnable接口的时候,构造函数Thread(Runnable target)不光可以传入Runnable接口的对象,还可以传入一个Thread类的对象.

注意:

a.线程的执行是对象调用start的方法,而不是直接调用重写的run方法,调用run方法就不是异步执行,而不是同步.

b.线程的调用是随机的,也就是说执行的结果与代码的执行顺序无关,代码的执行顺序与start()方法调用的顺序无关

三.实例变量和线程安全:

(1).不共享数据的情况

自己执行自己的,互不影响

(2).共享数据的情况

多个线程可以访问同一个变量,但这随之就会出现非线程安全的问题(与数据库中的读脏数据类似),这个时候就要考虑加锁,使用synchronized关键字,实现排队调用run方法的目的,加锁的代码称为"互斥区"或"临界区".

四.currentThread()方法,返回代码段正在被哪个线程调用的信息

五:isAlive()方法,判断当前线程是否处于活动状态,注意的是Thread.currentThread().isAlive()与this.isAlive()执行的结果可能有差异

六.sleep()方法在指定的毫秒内让当前"正在执行的线程"休眠(暂停执行)

七.getId()方法,取得线程的唯一标识

八.停止线程

(1).使用退出标志,使线程正常退出,也就是当run方法完成后线程终止

(2).使用stop方法强行终止线程,属于作废过期的方法

(3).使用interrupt方法中断线程,但是这个方法不会终止一个正在执行的线程,还需要加入一个判断才能完成线程的停止.

1):判断线程是否停止,

this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志置清除为false的功能,也就是连续调用两次,如果第一次是true,第二次就是flase.

this.isInterrupted():测试线程Thread对象是否已经是中断状态,但不清除状态标志

真正的停止线程:

(1).异常法(最常用的方法):

在主方法中调用interrupt()后,类的run方法这样判断(注意使用try{}carch(){}捕获):

if(this.interrupted()){

throw new InterruptedException();

}

(2).在沉睡中停止:

也就是在run方法中使线程睡眠足够的长,主方法中使用iinterrupt()方法,这个会抛出sleep interrupted异常

(3).暴力停止(停止使用):

使用stop()方法,会抛出java.lang.ThreadDeath异常,但不需要显示的捕捉,并且使用这个会释放锁,会导致共享数据出现问题.

(4).使用return停止线程

与第一种方法类似,就是将抛异常改为return;就好,不过还是建议使用第一种.

九:暂停线程:

(1).suspend()方法会暂停线程.

(2).resume()方法会恢复暂停的线程

这两个都是作废过期的方法,不建议使用,1).会造成公共的同步对象的独占,使得其他线程无法访问公共同步对象.2)不同步,容易出现因为线程的暂停二而导致数据不同步的情况.

十:yield()方法:放弃当前的CPU资源,将他让给其他的任务去占用CPU执行的时间.

十一.线程的优先级(1~10):

(1).线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务.

使用setPriority()方法来设置优先级

(2).线程的优先级具有继承性,也就是说A线程启动了B线程,则B线程的优先级与A是一样的.

(3).规则:CPU尽量将执行资源让给优先级比较高的线程

a.高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完.

b.当优先级的差距很大时,谁先执行完和代码的调用顺序无关

c.不要把线程的优先级与运行结果的顺序作为衡量的标准,优先级较高的线程并不一定每一次都限制性万run()方法中的任务,也就是说线程的优先级与打印顺序无关.

十二.守护线程.

守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁,典型的守护线程就是垃圾回收线程(垃圾回收器(GC))

使用setDaemon(true)可以将某个线程设置为守护线程.

时间: 2024-11-05 22:55:44

深入java多线程一的相关文章

java多线程一

最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结.1.JAVA多线程实现方式JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的. 2.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它

java 多线程一

java 多线程实现的几种方式: 1.extends Thread 2.implements Runnable 3.implements Callable<> 下面上代码: import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; /** * Created by root on 17-9-30. */ public class Test4Thread { public static void m

JAVA多线程之wait/notify

本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait() 与  notify/notifyAll() 的执行过程 ③中断 调用wait()方法进入等待队列的 线程 ④notify 通知的顺序不能错 ⑤多线程中测试某个条件的变化用 if 还是用 while? ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 wait()

Java多线程之wait(),notify(),notifyAll()

在多线程的情况下,因为同一进程的多个线程共享同一片存储空间,在带来方便的同一时候,也带来了訪问冲突这个严重的问题.Java语言提供了专门机制以解决这样的冲突,有效避免了同一个数据对象被多个线程同一时候訪问. wait与notify是java同步机制中重要的组成部分.结合与synchronizedkeyword使用,能够建立非常多优秀的同步模型. synchronized(this){ }等价于publicsynchronized void method(){.....} 同步分为类级别和对象级别

java多线程之ThreadLocal

ThreadLocal保证数据同步 package Thread.Common; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; class Accessor implements Runnable { private final int id; pub

java多线程之Future和FutureTask

Executor框架使用Runnable 作为其基本的任务表示形式.Runnable是一种有局限性的抽象,然后可以写入日志,或者共享的数据结构,但是他不能返回一个值. 许多任务实际上都是存在延迟计算的:执行数据库查询,从网络上获取资源,或者某个复杂耗时的计算.对于这种任务,Callable是一个更好的抽象,他能返回一个值,并可能抛出一个异常.Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. public interface Callab

Java多线程之Wait()和Notify()

1.Wait()和Notify.NotifyAll都是Object的方法 2.多线程的协作是通过控制同一个对象的Wait()和Notify()完成 3.当调用Wait()方法时,当前线程进入阻塞状态,直到有另一线程调用了该对象的Notify()方法 package Thread.Wait; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.con

Java多线程之notifyAll的作用域

notifyAll()因某个特定锁而被调用时,只有等待这个锁的任务才会被唤醒. package Thread.Wait; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; class Blocker { synchronized void waitingCall() { try

Java多线程之join

将另外一个线程join到当前线程,则需要等到join进来的线程执行完才会继续执行当前线程. package Thread.join; class Sleeper extends Thread { private int duration; public Sleeper(String name, int sleepTime) { super(name); duration = sleepTime; start(); } public void run() { try { sleep(duratio