线程的定义
在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程。
线程:是程序的执行单元,执行路径。是程序使用CPU的最基本单位。
单线程:如果程序只有一条执行路径。
多线程:如果程序有多条执行路径。
线程的意义
多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率。
程序的执行其实都是在抢CPU的资源,CPU的执行权。
多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到 CPU的执行权。就好像我雇了20个人帮我抽奖,我抽到奖的几率相对我一个人
我们是不敢保证哪一个线程能够在哪个时刻抢到,所以线程的执行有随机性。
并行和并发的区别
并行:逻辑层面同时发生,指在一定时间内同时运行多个程序
并发:物理层面同时发生,指在一个时间点同时运行多个程序
JVM是多线程的,因为在程序运行的时候,除了主函数线程,至少还要有辣鸡回收这个线程。
如何实现多线程
首先,线程是依赖进程的,所以应该先创建一个进程出来
而线程是由系统创建的,但是JAVA是不能直接调用系统功能的,所以我们需要调用C/C++写好的程序来实现多线程程序
用C/C++调用系统功能创建进程,然后用JAVA去调用这样的东西,然后提供一些类(Thread)供我们使用,我们就可以实现多线程程序了
实现多线程的方法
创建新执行线有两种方法
一种方法是将类声明为Thread的子类,即继承Thread类
步骤:
A:自定义类继承Thread类
B:自定义类重写父类的run()方法,因为不是类中的所有方法都需要被线程执行,而这个时候,为了区分,用run()方法来包含那些需要被线程执行的代码。
C:创建对象
D:启动线程
public class MyThread extends Thread{
public void run(){
for(int x=0;x<10;i++){
System.out.println(x);
}
}
public static void main(String[] agrs){
MyThread my = new MyThread();
my.run();
}
}
但是此时run()方法并不是多线程的,如果想要使用多线程的方式,则需要了解start()方法
start()方法首先启动了线程,然后再由jvm去调用该线程的run()方法
//创建两个线程对象
MyThread my1 =new MyThread();
MyThread my2 =new MyThread();
my1.start();
my2.start();
但是这样的话,两个线程的输出都掺和在一起,无法分辨谁是谁,
可以通过在MyThread中使用从Thread继承的getName()方法,在输出值之前标记getName(),默认输出Thread-加序号,序号是按照线程执行的先后定义的 ,但是也可以使用setName()方法给定线程一个名称。例如:
public class MyThread extends Thread{
public void run(){
for(int x=0;x<10;i++){
System.out.println(getName()+"---"+x);
}
}
public static void main(String[] agrs){
MyThread my = new MyThread();
my.setName("王小帅");
my.run();
}
}
另一种方法是
实现Runable接口
步骤:
A:自定义类MyThread实现Runnable接口
B:重写run()方法
C:创建MyRunnable类的对象
D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
代码:
package day12;
public class MyRunnable implements Runnable {
public void run() {
for(int i=0;i<=100;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
package day12;
public class MyRunnableDemo {
public static void main(String[] args) {
//创建MyRunnable类的对象
MyRunnable my = new MyRunnable();
//创建Thread类的对象,并把C步骤的对象作为构造函数参数传递
Thread t1 =new Thread(my);
Thread t2 =new Thread(my);
t1.setName("零直选");
t2.setName("左丘明");
t1.start();
t2.start();
}
}
####多线程两种方式的图解比较和区别
![如图](https://img.haomeiwen.com/i14378624/3b8889bd7d6491ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
####线程调度
#####线程休眠
public static void sleep(long millis)
参数为毫秒
线程休眠需要异常处理
#####加入线程
public final void join():等待该线程终止后其他线程再执行
#####礼让线程
public static void yield():暂停当前正在执行的线程对象,并执行其他线程
让多个线程的执行更和谐,并不能靠他保证一人一次
####线程的生命周期
![线程的生命周期](https://img.haomeiwen.com/i14378624/df7f95e824317dc2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
网友评论