目录
一、前言
二、线程和过程
三、多线程的创立
多线程创立的两种形式:
形式①:
形式②:
四、几个常见的问题?
为什么要重写 run 办法?
run()办法和 start 办法的区别?
通过继承的办法和实现接口的形式创立多线程,哪个好?
五、线程管制
sleep:
join
setDaemon():
六、线程的生命周期
一、前言
线程可能听起来有点难,其实也是十分好了解的,咱们以游戏姿态进入。
二、线程和过程
过程:是正在运行的,过程是资源分配的最小单位。
线程:是 cpu 调度的最小单位(线程依赖于过程)。
下面可能有些难懂,打个比喻,好比你打一把王者(其实我不玩哈 doge),过程比作是你
开的那一把游戏,线程比作成每个玩家所选的英雄或者是游戏中的水晶野怪等之类的。带着
这个比喻来了解过程和线程的一些关系。
一个过程有多个线程就叫多线程。是不是感觉十分好了解。
1. 线程在过程下进行
1.(比方你独自的英雄角色、野怪、小兵必定不能运行)
2. 过程之间不会相互影响,一个线程完结将会导致整个过程完结
2.(两把游戏之间不会有分割和影响。你的水晶被推掉,你这把游戏就完结了)
3. 不同的过程数据很难共享
3.(两把游戏之间很难有分割,有分割的状况比方上把的敌人这把又匹配到了)
4. 同过程下的不同线程之间数据很容易共享
4.(你开的那一把游戏,你能够看到每个玩家的状态(生死),也能够看到每个玩家的出配备等等)
5. 过程的应用内存地址能够限定使用量
5.(开的房间模式,你能够设置有多少人进,当房间满了后,其他人就进不去了,除非有人退出房间,其他人能力进)
举荐浏览:《Java 高并发编程详解 - 多线程与架构设计》,点此可收费支付电子版书籍
三、多线程的创立
多线程创立的两种形式:
♠①:创立一个类继承 Thread 类,并重写 run 办法。
♠②:创立一个类实现 Runnable 接口,并重写 run 办法。
形式①:
MyThread 类下:
public class MyThread extends Thread {
@Override
public void run() {for(int i=0;i<100;i++){System.out.println(getName()+": 打了"+i+"个小兵");
}
}
}
MyThreadText 类下:
public class MyThreadText {public static void main(String[] args) {
// 创立 MyThread 对象
MyThread t1=new MyThread();
MyThread t2=new MyThread();
MyThread t3=new MyThread();
// 设置线程的名字
t1.setName("鲁班");
t2.setName("刘备");
t3.setName("亚瑟");
// 启动线程
t1.start();
t2.start();
t3.start();}
}
效果图:
形式②:
MyRunnable 类下:
public class MyRunnable implements Runnable {
@Override
public void run() {for(int i=0;i<10;i++){
try {//sleep 会产生异样要显示解决
Thread.sleep(20);// 暂停 20 毫秒
} catch (InterruptedException e) {e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"打了:"+i+"个小兵");
}
}
}
MyRunnableText 类下:
public class MyRunnableText {public static void main(String[] args) {
// 创立 MyRunnable 类
MyRunnable mr=new MyRunnable();
// 创立 Thread 类的有参结构, 并设置线程名
Thread t1=new Thread(mr,"张飞");
Thread t2=new Thread(mr,"貂蝉");
Thread t3=new Thread(mr,"吕布");
// 启动线程
t1.start();
t2.start();
t3.start();}
}
有 sleep 暂停的效果图:
举荐浏览:《Java 高并发编程详解 - 多线程与架构设计》,点此可收费支付电子版书籍
四、几个常见的问题?
为什么要重写 run 办法?
因为 run 办法是用来封装被线程执行的代码。
un()办法和 start 办法的区别?
run(): 封装线程执行的代码,间接调用相当于调用一般办法。就是始终到这个办法完结才进去。
start(): 启动线程,而后由 JVM 此线程的 run()办法,可同时进行多个对象调用 start()办法。
通过继承的办法和实现接口的形式创立多线程,哪个好?
实现 Runable 接口好,起因:
①防止了 Java 单继承的局限性
②适宜多个雷同的程序代码去解决同一资源的状况,把线程、代码和数据无效的拆散,
体现进去面向对象的设计思维。
五、线程管制
sleep:
sleep 的应用要进行显示解决异样:
try {//sleep 会产生异样要显示解决
Thread.sleep(20);// 暂停 20 毫秒
} catch (InterruptedException e) {e.printStackTrace();
}
join:
♠ join 是指期待这个线程执行完才会轮到后续线程失去 cpu 的执行权,应用这个也要抛出异样
具体应用:
public class MyThreadText {public static void main(String[] args) throws InterruptedException {//throws 抛出 join 呈现的异样
// 创立 MyThread 对象
MyThread t1=new MyThread();
MyThread t2=new MyThread();
MyThread t3=new MyThread();
// 设置线程的名字
t1.setName("鲁班");
t2.setName("刘备");
t3.setName("亚瑟");
// 启动线程
t1.start();
t1.join();// 期待 t1 执行完才会轮到 t2,t3 抢
t2.start();
t3.start();}
}
setDaemon():
t1.setName("张飞");
t2.setName("关羽");
t3.setName("刘备");
t1.setDaemon(true);
t2.setDaemon(true);
为 true 时阐明是守护线程。
将 t1,t2 设置守护线程 t3 就是主线程了,则当所有的主线程完结后,守护线程也会跟着
完结,但不是立即完结。
六、线程的生命周期
举荐浏览:《Java 高并发编程详解 - 多线程与架构设计》,点此可收费支付电子版书籍