🎊专栏【JavaSE】
🍔喜欢的诗句:路漫漫其修远兮,吾将上下而求索。
🎆音乐分享【如愿】
🎄欢迎并且感谢大家指出小吉的问题🥰
文章目录
- 🌺进程
- 🌺线程
- 🎄并发
- 🎄并行
- 🍔多线程的实现方式
- 🛸方式一
- 🛸方式二
- ⭐注意
- 🛸方式三
- 🥰三种方法的对比
- ✨成员方法
- 🎈创建对象并执行
- 🎆注意
- 🎈线程优先级
- 🎈守护线程
- 🎈礼让线程
- 🎈插入线程
🌺进程
进程是程序的基本执行实体
一个软件运行后,它就是一个进程
🌺线程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位
简而言之
是应用软件中互相独立,同时可以运行的功能
🎄并发
在同一时刻,有多个指令在单个
CPU上交替
执行
🎄并行
在同一时刻,有多个指令在多个
CPU上同时
执行
🍔多线程的实现方式
🛸方式一
1.自己定义一个类继承Thread
2.重写run方法
3.创建子类的对象,并启动线程
创建MyThread.java
public class MyThread extends Thread{
@Override
public void run(){
//书写线程要执行的代码
for (int i=0;i<100;i++){
System.out.println(getName()+"关注一下吧");
}
}
}
创建Demo1.java
public class Demo1 {
public static void main(String[] args) {
MyThread t1=new MyThread();
MyThread t2=new MyThread();
t1.setName("线程一");
t2.setName("线程二");
//开启线程
t1.start();
t2.start();
}
}
发现程序一会执行线程一,一会执行线程二
🛸方式二
1.自己定义一个类实现Runnable接口
2.重写里面的run方法
3.创建自己类的对象
4.创建一个Thread类的对象,并开启线程
创建MyRun.java
public class MyRun implements Runnable{
@Override
public void run() {
//书写线程要执行的代码
for (int i=0;i<100;i++){
//获取到当前线程的对象
Thread t=Thread.currentThread();
System.out.println(t.getName()+"关注一下吧");
}
}
}
创建Demo1.java
public class Demo1 {
public static void main(String[] args) {
//创建MyRun的对象
//表示多线程要执行的任务
MyRun mr=new MyRun() ;
//创建线程对象
Thread t1=new Thread(mr);
Thread t2=new Thread(mr);
t1.setName("线程一");
t2.setName("线程二");
//开启线程
t1.start();
t2.start();
}
}
发现程序一会执行线程一,一会执行线程二
⭐注意
原因
因为第一种方法是继承关系(extend),子类继承父类的方法
但是第二种方法没有继承关系,所以就不能这么使用
🛸方式三
这种方式可以获得多线程运行的结果
1.创建一个类MyCallable实现Callable接口
2.重写call(是有返回值的,表示多线程运行的结果)
3.创建MyCallable的对象(表示多线程要执行的任务)
4.创建FutureTask的对象(管理多线程运行的结果)
5.创建Thread类的对象,并启动(表示线程)
创建MyCallable.java
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
//求1——100的和
int sum=0;
for (int i=0;i<100;i++){
sum+=i;
}
return sum;
}
}
创建Demo1.Java
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Demo1 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建MyCallable的对象(表示多线程要执行的任务)
MyCallable mc=new MyCallable();
//创建FutureTask的对象(管理多线程运行的结果)
FutureTask<Integer>ft=new FutureTask<>(mc);
//创建线程的对象
Thread t1=new Thread(ft);
//启动线程
t1.start();
//获取多线程运行的结果
Integer result=ft.get();
System.out.println(result);
}
}
🥰三种方法的对比
✨成员方法
🎈创建对象并执行
创建Demo1.java
package IODemo6;
public class Demo1 {
public static void main(String[] args) {
//创建线程的对象
MyThread t1=new MyThread("飞机");
MyThread t2=new MyThread("大炮");
//开启线程
t1.start();
t2.start();
}
}
创建MyThread.java
package IODemo6;
public class MyThread extends Thread{
public MyThread(){
}
public MyThread(String name){
super(name);
}
@Override
public void run(){
for (int i=0;i<100;i++){
System.out.println(getName()+"@"+i);
}
}
}
🎆注意
为什么会报错
原因
构造方法是不能继承的,如果子类想要使用父类的构造,那么需要自己写一个利用super关键字来调用父类的构造
🎈线程优先级
线程优先级越大,这条线程抢到CPU的概率
就越大
🎈守护线程
当主线程结束后,守护线程也会结束
比如我们在传输文件的时候,传输文件是一个线程,聊天窗口是一个线程,我们把聊天窗口给关闭后,传输文件也不能进行,那么这个时候我们就可以把传输文件设置为守护线程
守护线程
不是立刻结束的
,是陆续结束的
🎈礼让线程
首先执行的线程会让出CPU的执行权,使执行结果更加均匀
🎈插入线程
如果大家对于文章的知识点有疑问,欢迎在评论区进行讨论