1.什么是进程?
2.什么是线程?
3.为什么使用多线程?
4.java如何创建多线程?
1.什么是进程?
进程:正在进行的程序。是系统分配资源的基本单元。
2.什么是线程?
线程(轻量级线程)是进程中的一条执行路径,也就是CPU的基本调度单位。
多线程:一个程序同一时间执行多个线程。
一个进程由一个或多个线程组成,彼此之间完成的工作不同(任务),同时执行,成为多线程。
--我们写的代码就是单线程的
3.为什么使用多线程?
充分利用cpu,提高程序的效率
生活中的例子:好比一个人可以干好多事情--吃饭、睡觉、学习...
软件例子:wx--视频、聊天、拍照、转账....
3.1设置和获取线程的名称
Thread.currentThread():获取当前线程对象
.getName():获取线程名--默认名称Thread-n,该方法必须在Thread类下才能用
4.java如何创建多线程?
java中提供了三种实现多线程的方式:
①继承Thread类
②实现Runnable接口
③实现Callable接口
4.1继承Thread类
语法:继承Thread、重写run方法、创建线程对象、开启线程
结果是同时进行--不分先后顺序,只看再特定条件内任务完成后的结果。
好比多轮抢答一样,每个人要求都有抢答次数,线程结束只要任务完成就好。
package com.wjy;
public class MyThreadAL extends Thread{
private int tick = 100;
@Override
public void run() {
while (true){
if (tick>0){
tick--;
System.out.println("当前线程对象的名字为:"+Thread.currentThread().getName()+"----剩余:"+tick+"张票");
}else {
break;
}
}
}
}
package com.wjy;
public class TestAl01 {
public static void main(String[] args) {
MyThreadAL myThreadAL1 = new MyThreadAL();
myThreadAL1.start();
MyThreadAL myThreadAL2 = new MyThreadAL();
myThreadAL2.start();
MyThreadAL myThreadAL3 = new MyThreadAL();
myThreadAL3.start();
MyThreadAL myThreadAL4 = new MyThreadAL();
myThreadAL4.start();
}
}
4.2实现Runnable接口
语法:实现Runnable、重写run方法、创建线程对象、开启线程
Runnable runnable = new Runnable();//创建线程任务对象
线程安全:多个线程共享一个资源,导致线程安全隐患。---在后面可以使用锁解决。
超卖多买的现象:好比毒圈,刚开始只有一个人在安全区,这个人已经宣布胜利,但等到最后突然出来一个人也到达安全区,因此两个获胜者(多买),原本只有一个胜利者的情况此时多出了一个(超卖)。
package com.wjy.runnable;
public class MyRunnableAL implements Runnable{
private int tick = 100;
@Override
public void run() {
while (true){
if (tick>0){
tick--;
System.out.println(Thread.currentThread().getName()+" tick:"+tick);
}else {
break;
}
}
}
}
package com.wjy.runnable;
public class Test02 {
public static void main(String[] args) {
MyRunnableAL myRunnableAL1 = new MyRunnableAL();
new Thread(myRunnableAL1,"A").start();
MyRunnableAL myRunnableAL2 = new MyRunnableAL();
new Thread(myRunnableAL2,"B").start();
MyRunnableAL myRunnableAL3 = new MyRunnableAL();
new Thread(myRunnableAL3,"C").start();
MyRunnableAL myRunnableAL4 = new MyRunnableAL();
new Thread(myRunnableAL4,"D").start();
}
}
4.3继承Thread和实现Runnable哪种方式比较好:
实现Runnable的扩展性更好,也就是说实现Runnable后,还可以继续实现别的接口,
但是继承Thread之后无法继承别的类。
4.4实现Callable接口
语法:实现Callable<数据类型>、重写方法、
创建执行任务类--后封到FutureTask中--封到Thread创建线程类中、开启线程、从futureTask中.get()获取执行结果