一.基础知识
1.线程与进程
进程:进程是程序关于某项操作的一次运行活动,是操作系统进行资源调度和分配的单位。进程是线程的集合。
线程:线程是进程的一条执行路径,是cpu进行调度和分配的单位。
举例:进程就像是一个工厂,完成着cpu分配的任务,同一时刻只能有一条线程在执行,线程就好比是工厂的工人,许多工人同时完成任务。
2.什么是多线程
在同一时刻,有多条执行路径,多线程的目的是提高程序的运行效率。
3.多线程使用场景
迅雷下载、数据库连接池、分批发送短信。
4.多线程的创建方式
(1)继承Thread,重写run方法。
package com.zhu.mayi.thread_demo;
/**
* Hello world!
*
*/
//1.什么是线程?线程是进程的一条执行路径
//2.什么是多线程?多线程是在一个进程中,多条线程并发执行
//3.在一个进程中,一定会有主线程
//4.线程分为:主线程、子线程、GC线程、用户线程、守护线程
//多线程的实现方式? 1.继承thread类重写run方法 2.实现runnable接口 3.利用匿名内部类方式 4.使用线程池
//1.继承thread类重写run方法
class test extends Thread{
@Override
public void run() {
for(int i = 0;i<10;i++){
System.out.println("chird:i="+i);
}
}
}
public class threagTest1
{
public static void main( String[] args )
{
System.out.println("主线程开始");
test test1 = new test();
test1.start();
for(int i = 0;i<10;i++){
System.out.println("main:i="+i);
}
System.out.println("主线程结束");
}
}
(2)实现runnable接口。
package com.zhu.mayi.thread_demo;
class test2 implements Runnable{
public void run() {
for(int i = 0;i < 10;i++){
System.out.println("i="+i);
}
}
}
//实现Runnable接口,重写run方法
/**
* @author johson
*
*/
public class threadTest2 {
public static void main(String[] args){
System.out.println("主线程开始");
test2 test = new test2();
Thread thread = new Thread(test);
thread.start();
for(int j = 0;j < 10;j++){
System.out.println("j="+j);
}
System.out.println("主线程结束");
}
}
(3)使用匿名内部类。
package com.zhu.mayi.thread_demo;
public class threadTest3 {
//使用内部类方式
public static void main(String[] args){
System.out.println("主线程开始");
Thread thread = new Thread(new Runnable() {
public void run() {
for(int i = 0;i < 10;i++){
System.out.println("i=" + i);
}
}
});
thread.start();
for(int j = 0;j < 10;j++){
System.out.println("j=" + j);
}
System.out.println("主线程结束");
}
}
(4)实现Callable接口。
未作实现
5.多线程的五种状态
(1)新建状态:线程刚被创建的时候,使用new关键字创建线程——new Thread(t),此时线程的代码还未执行。
(2)就绪状态:线程新建后,需要通过start()方法去执行。start()方法创建线程运行的系统资源,线程就进入了就绪状态。也就是说,就绪状态就是在线程创建后,获得cpu时间执行run()方法之前。
(3)运行状态:获得CPU时间后,它才进入运行状态,开始执行run()方法。
(4)阻塞状态:阻塞状态有以下几种情况:
a.线程调用了sleep()方法进入睡眠状态。
b.线程试图获取一个锁,但是这个锁正被其他线程占用,还未释放。
c.线程正在等待某个触发条件。
(5)死亡状态:死亡状态可能有以下原因造成:
a.run()方法正常执行完毕
b.程序发生异常,造成run()方法结束
为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false。
6.多线程的几种方法
a.join()方法
将执行权交给另一个线程。例如当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1。
b.Yield方法
Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。(可能没有效果)
c.wait、notify方法
wait()暂定当前正在执行的线程,并释放资源锁,让其他线程可以有机会运行notify/notifyall: 唤醒因锁池中的线程,使之运行
d.sleep方法
sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
————————————————————————————————————————未完待续,欢迎各位大佬指出问题。