多线程
先打开任务管理器找到进程
电脑可以同时执行很多应用,让我们有很好的体验,这都是多进程的功劳,让我们可以一边聊着天,一边听着歌,一边下着片儿。下面主要来介绍一下java多线程
进程与线程:
进程是指正在执行的程序,负责该程序的内存空间分配,代表了内存中的执行区域。在传统的操作系统中,进程是资源分配和调度的基本单位。
进程可以看作一连串执行的指令,而一个线程就是指令的一个执行路径。一个进程可以包含多个线程,同一进程中的多个线程共享相同的内存空间。
进程与线程的最大区别在于:进程占有资源,而线程不占有资源。可以将线程理解为轻量级的进程。同一进程中的多个线程护具共享意味着变量的共享,多个线程共同对数据进行操作。
多线程
Java提供了并发机制,在程序中并发执行多个线程,并且每个线程实现不同的功能,这种机制被称为多线程。
主线程
当JVM启动之后,加载类文件,发现main方法,那么就会为main方法创建一个线程,
用于main方法执行,这个为main方法创建的线程称为主线程
线程基本组成部分:
cpu时间片:操作系统(os)会为每个线程分配执行时间
运行数据:
- 堆空间:存储线程需使用的对象,多个线程可以共享堆中的对象
- 栈空间:存储线程需使用的局部变量,每个线程都拥有独立的栈
线程创建
创建线程的两种方式:
Thread类创建线程
Thread构造方法 | 说明 |
Thread() | 创建一个线程对象 |
Thread(String name) | 创建一带有制定名称name的线程对象 |
Thread(Runnable target) | 创建一个基于Runnable接口实现类的线程对象 |
Thread(Runnable target,String name) | 创建一个基于Runnable接口实现类,并具有指定名称name的线程对象 |
Thread类常用方法 | 说明 |
public void run() | 线程相关的代码,一般需要重写 |
public void start() | 启动线程的方法 |
public static void sleep(long m) | 线程休眠m毫秒 |
public void join() | 优先执行调用join()方法的线程 |
public class MyThread extends Thread {
public MyThread(String name){//子类构造方法
super(name);
}
public void run() {
System.out.println("这是一个线程");
}
public static void main(String[] args) {
MyThread myThread = new MyThread("mythread");//创建线程对象
myThread.start();//启动线程
}
}
2、实现Runnable接口创建线程
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("正在执行"+Thread.currentThread().getName());
}
public static void main(String[] args) {
MyRunnable obj = new MyRunnable();//创建类myRunnable对象
Thread thread1 = new Thread(obj,"线程1");//创建Thread对象,将obj作为参数传递给Thread类的构造方法。
Thread thread2 = new Thread(obj,"线程2");
Thread thread3 = new Thread(obj,"线程3");
Thread thread4 = new Thread(obj,"线程4");
thread1.start();
thread2.start();//启动线程
thread3.start();
thread4.start();
}
}
线程的生命周期:
最 “ 漂亮 ” 的是我自己画的。找了几个对比着来看
线程调度
优先度
所有的线程都具有有限度属性。在竞争资源时,一般来说优先度高的线程会优先得到运行。
线程优先度可以通过getPriority()方法取得
Thread thread = new Thread(runnable);
System.out,println(thread.getPriority());
thread,start();
设定优先度
使用setPriority()方法。参数中指定表示优先度的数字,它的最大值(10)和(1)分别用Thread.MAX_PRIORITY定义和Thread.MAX_PRIORITY定义。参数值必须在这个范围内。默认优先度为5。定义为Thread.NORM_PRIORITY。
thread.setPriority(thread,MAX_PRIORITY);
thread.setPriority(2);
注意:
根据优先度的差别分配资源的方法,依赖于操作系统和Java虚拟机的实现,不能保证高优先度的线程一定会优先得到运行权,因此在因运行顺序不同而会引起混乱的情况下,就不能使用设定有限度的方法来进行多线程调度。
线程安全
未完待续。。。
守护线程:运行在后台,为其他前台线程服务
特点:一旦所有用户线程都结束运行,守护线程会随jvm一起结束工作
应用:
- 数据库连接池中的监测线程
- jvm虚拟机启动后的监测线程
- 常见垃圾回收线程
设置守护线程:
用户可以使用setDeamon(boolean on) 方法来将线程设置为守护线程,但注意需要在线程启动之前设置,即在start()方法之前调用。