Java多线程学习总结

Java多线程学习总结

Java多线程学习总结

一、线程的基本概念

简单的说:线程就是一个程序里不同的执行路径,在同一个时间点上cpu只会有一个线程在执行,Java里的多线程是通过java.lang.Thread类来实现的,每个线程都拥有自己独立的方法栈空间。

二、java线程的创建和启动

第一种

定义线程类实现Runnable接口:

Thread myThread = new Thread(target) //target为Runnable接口类型

Runnable中只有一个方法:

public void run();用以定义线程运行体

第二种

可以定义一个Thread的子类并重写其run方法:

clas MyThread extends Thread{

public void run(){}

}

线程类必须通过执行Thread的start()方法启动一个新的线程,如果调用run()方法是属于方法的调用,不会启动一个新的线程,推荐使用第一种方式创建线程,使用接口较为灵活。

三、线程状态装换

调用线程start()方法时,线程进入就绪状态,Cpu分配时间片,线程进入运行状态,时间片结束,run()方法未执行完,线程进入阻塞状态。

四、线程控制基本方法

isAlive() //判断线程是否还“活着”,即线程是否还未终止

getPriority() //获得线程的优先级数值

setPriority() //设置线程的优先级指数

Thread.sleep() //静态方法,将当前线程睡眠指定毫秒数

join() //调用某线程的该方法,将当前线程与该线程合并,

//即等待该线程结束,再回复当前线程的运行。

yield() //让出CPU,当前线程进入就绪状态等待调度

interrupt() //中断线程

wait() //当前线程进入对象的wait pool

notify()/all //唤醒对象的wait pool中的一个/所有等待线程

五、sleep方法

Thread的静态方法

public static void sleep(long millis)throws InterruptedException 必须对异常进行捕捉

Thread.currentThread(); //拿到当前线程


第二篇:Java多线程总结


多线程总结

在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多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核心技术,成为真正的技术高手;通过大量全真企业项目疯狂训练,迅速积累项目经验。让你成为技能型的现代化高端人才,迅速获得高薪就业!时间不等人,赶紧联系我们吧!

标签:

相关文章