基本概念:
并发性和并行性:
并发性指的是同一时刻只能有一条指令执行,但是多个进程指令被快速轮换执行
并行性是指同一时刻,有多条指令在多个处理器上同时执行,使得在宏观上具有多个进程同时执行的结果
临界区:修改共享资源的代码区
1、线程实现有三种方式:
(1)类ThreadName(引用为a)继承Thread,然后调用a.start();
(2)类ThreadName(引用为b)实现接口Runnable,然后new Thread(b).start();
(3)类ThreadName(引用为c)实现接口Callable<Integer>,然后call方法作为执行体,会有返回值。
声明FutureTask<Integer> task = new FutureTask<Integer>(c);
Thead thread = new Thread(task).start();
一般采用实现接口的方式实现,有以下有优点:
使用实现Runnable接口和Callable接口的可以继续实现其他接口或继承
在这种方式下,多个线程可以共享一个target对象(共享线程类的实例属性),所以非常适合多个相同线程处理同一份资源的情况 实现Runnable和Callable的最大区别在于Callable是调用call方法,有返回值的
2、线程的生命周期:新建、就绪、运行、阻塞、死亡
线程在以下三种方式之一结束后就会处于死亡状态
(1)run()方法执行完成,线程正常结束
(2)线程抛出一个未捕获的Exception或Error
(3)直接调用该线程的stop()方法来结束该线程——该方法很容易导致对象受破坏,通常不推荐使用
3、线程的一些方法
join():等待另一线程执行完才执行
sleep():睡眠,不会释放对该同步监视器的锁定
wait():等待直到有notify()或者notifyAll()的调用,会释放对该同步监听器的锁定
yield():暂时放弃cpu占用,变为就绪,不会释放对该同步监视器的锁定
notify():从wait()后的线程中,调度其中一个线程
notifyAll():唤醒所有wait()后的线程
suspend():将该线程挂起,不会释放对该同步监视器的锁定。直到有resume(),但是这种方式会引起死锁,应尽量避免使用
4、线程同步
(1)使用synchronized同步代码块或同步方法
(2)使用同步锁Lock
5、线程的通信
(1)传统的方式是使用上面3的方法进行通信
(2)如果使用了同步锁Lock,则不能使用wait()、notify()、notifyAll()进行线程通信,这时需要使用Condition
(3)是要哄阻塞队列控制线程的通信
6、线程池
7、Daemon Thread的特点:如果所有的前台线程都死亡,后台线程会自动死亡,然后虚拟机也退出,基于这样的特点,有些功能是不合适用守护线程来实现的
创建守护线程的过程应该注意:setDaemon(true)必须在start()方法之前调用。否则会引发IllegalThreadStateException异常
8、sleep方法和yield方法的区别:
(1)sleep方法暂停当前线程,会给其他线程执行机会,不会理会其他线程的优先级;但是yield方法只会给优先级相同或更高的线程执行的机会。所以yield完全有可能变成就绪后直接就又重新执行
(2)sleep方法声明抛出了InterruptedException异常,所以调用sleep方法要么捕捉该异常,要么显示声明抛出该异常。而yield方法则没有声明抛出任何异常
(3)sleep方法比yield方法有更加好的移植性,通常不要依靠yield来控制并发线程的执行
多线程总结
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请登陆疯狂java官网。
1.重写线程Thread,Runnable运行的是run方法,当调用线程start()时,会运行其run方法,
也可以主动去调用,只不过不在同一个线程里。
当一个线程既继承了Thread又继承Runnable,其thread必须调用target.run()实现对runnable的方法调用。
2.Object:的三种线程方法 wait() ,notify() ,notifyAll()
在某个线程里执行某个对象锁的wait方法会暂停该线程的运行,在另外一条线程里利用该锁的notify方法
可以唤醒某个该对象锁所在的线程;当该对象锁在多个线程里wait的时候,可以使用notifyAll唤醒运行。
3.线程调度-休眠/优先级/让步/合并/守护线程
休眠。静态方法Thread.sleep();谁调用谁休眠
对于优先级高的线程获取CPU机率比较大,并不一定优先级低的运行不了线程的让步含义就是使当前运行着线程让出CPU资源,但是然给谁不知道,仅仅是让出,线程状态回到可运行状态。Thread.yield()
线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。 调用某个线程的join(),该线程运行完才运行调用它的线程代码。
守护线程的特征是当setDaemon(boolean on)将该线程标记为守护线程或用户线程。
当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。实际上:JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态
4.线程的同步-同步方法/同步块
在多个线程运行的时候,是否有竞争资源同时改动。应该把竞争资源设为私有,并提供修改方法。可以是对修改方法的同步,也可以对代码块同步。 同步使用synchronized关键字。
5.线程池-JAVA5 API
固定线程池:
//创建一个可重用固定线程数的线程池 ExecutorService pool =
Executors.newFixedThreadPool(2);
//创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
ExecutorService pool = Executors.newSingleThreadExecutor();
//当要加入的池的线程(或者任务)超过池最大尺寸时候,则入此线程池需要排队等待。一旦池中有线程完毕,则排队等待的某个线程会入池执行。 可变尺寸的线程池:
//创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时
将重用它们。 ExecutorService pool = Executors.newCachedThreadPool(); 延迟连接池:
//创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。 ScheduledExecutorService pool = Executors.newScheduledThreadPool(2); //pool.execute(t3); //使用延迟执行风格的方法 pool.schedule(t4, 10, TimeUnit.MILLISECONDS);
//单任务延迟线程池:
//ScheduledExecutorService pool =
Executors.newSingleThreadScheduledExecutor();
6.有返回值的线程-JAVA5 API
线程不再继承runnable借口,而是callable接口并重写call方法。通过线程池submit调用,返回的Future对象,通过get()方法取得返回的对象。
7.线程锁:-JAVA5 API
Lock类代替synchronized,在需要同步的代码块里调用lock(),unlock(). -ReentrantLock
ReadWriteLock 用于I/0读写。
-ReentrantReadWriteLock
8.-JAVA5 API
//阻塞队列:java.util.concurrent.BlockingQueue继承了Queue接口,且是固定个数的队列,当队列满了,需要继续添加,或者队列没有元素,需要取出时,队列阻塞。
//阻塞栈:对于阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构。
java.util.concurrent.BlockingDeque
是JAVA6 API中新提出的一个类。
9.线程调度-JAVA5 API
通过Lock对象的newCondition()得到Condition对象,并调用其await();signalAll();等。对应了Object中wait();
notifyAll();
10.原子量-JAVA5 API
java.util.concurrent.atomic的使用需要Lock的配合。
11.障碍器-JAVA5 API
CyclicBarrier c=CyclicBarrier(等待子线程数, 等待完毕需要执行的Runnable);子线程需要调用c的await().来通知主线程已经完成了子任务。
疯狂Java培训专注软件开发培训,提升学员就业能力,重点提升实践动手能力。技术知识沉淀深厚的老师,让你感受Java的魅力,激发你对于编程的热爱,让你在半年的时间内掌握8-10万的代码量,掌握Java核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!
基本概念:并发性和并行性:并发性指的是同一时刻只能有一条指令执行,但是多个进程指令被快速轮换执行并行性是指同一时刻,有多条指令在多…
Java多线程总结Java多线程总结目标:理解程序、线程和进程的概念理解多线程的概念掌握线程的各种状态熟练使用Thread类、Ru…
Java多线程总结线程的四种状态:就绪Runable——运行中Running——阻塞Blocked——死亡Dead(结束)线程的状…
Java线程概念与原理一操作系统中线程和进程的概念现在的操作系统是多任务操作系统多线程是实现多任务的一种方式进程是指一个内存中运行…
Java多线程编程总结Java语言的一个重要特点是内在支持多线程的程序设计多线程是指在单个的程序内可以同时运行多个不同的线程完成不…
一.Java多线程的实现方式JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorS…
多线程总结在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多…
Java多线程总结线程的四种状态:就绪Runable——运行中Running——阻塞Blocked——死亡Dead(结束)线程的状…
Java多线程总结Java多线程总结目标:理解程序、线程和进程的概念理解多线程的概念掌握线程的各种状态熟练使用Thread类、Ru…
Java多线程学习总结一、线程的基本概念简单的说:线程就是一个程序里不同的执行路径,在同一个时间点上cpu只会有一个线程在执行,J…
我们知道,在操作系统级别上软件的运行一般都是以进程为单位,而在每个进程的运行过程中允许同时并发执行多个不同线程,这就使得一个程序能…