Java多线程详解(一)

概念:

Java多线程的重要性不言而喻,不管是平时开发还是面试问题,多线程始终作为很看重的一点,那么我们来看看多线程到底是怎么样的吧

说到线程就不得不提到进程

进程和线程

进程:可以看作一段代码,一个正在运行的程序
线程:可以堪称计算机运行中的一小块代码
线程是进程中的最小单位

进程的概念:

任务管理器可以有多个进程,每个进程运行的都是可执行程序,一个可执行程序就是一个软件,可执行程序的本质就是在计算机当中运行的一块代码

线程的作用:

它包装了一个功能,交给CPU去进行处理

1.独立使用CPU资源

2.每一个线程都是独立存在的,互不干扰

自定义线程

新建自定义线程的类,继承Thread,然后覆写run方法实现想要的功能,再到主方法里面去调用,文最末尾附上Demo

注意事项

直接调用run方法和start的区别?

  1. 可以直接调用run方法,但是没有启动一个独立的线程;

  2. 只有调用start 才回启动一个独立的线程;

自己启动的线程和主线程有关系吗?

直接写一个最简单的hello word 程序,就有一个主线程

一个线程一旦启动就是独立的了,和创建启动它的环境没有直接的包含关系

实现方式

继承Thread实现

实现方式一

自定义类继承Theard来进行创建,覆写run方法,然后在主方法中调用对象.start();方法启动

引入Runnable实现

实现方式二

自定义类implements Runnable接口,覆写run方法,在主方法中实例化自定义类的对象和Thread对象,在实例化Thread对象的时候传入自定义类的对象,然后Thread对象.start()来启动

Demo

Thread实现

自定义听音乐线程类

1
2
3
4
5
6
7
8
9
10
11
package com.ifueen.classdemo._01Game;

public class MusicThread extends Thread{
@Override
public void run() { //覆写run方法
// TODO Auto-generated method stub
for (int i = 0; i < 30; i++) {
System.out.println("正在听音乐:"+"第"+i+"次");
}
}
}

自定义玩游戏线程类

1
2
3
4
5
6
7
8
9
10
11
package com.ifueen.classdemo._01Game;

public class GameThread extends Thread{
@Override
public void run() { //覆写run方法
// TODO Auto-generated method stub
for (int i = 0; i < 30; i++) {
System.out.println("正在玩游戏:"+"第"+i+"次");
}
}
}

测试主类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.ifueen.classdemo._01Game;

public class Game {
/*
* 启动两个线程
*
* 玩游戏线程
* 听音乐线程
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
GameThread gt = new GameThread();
MusicThread mc = new MusicThread();

gt.start(); //启动游戏线程
mc.start(); //启动音乐线程

}

}

引入Runnable实现

自定义线程类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.ifueen.classdemo._05Runnable;

public class _05MyThread implements Runnable {
int num = 50;
@Override
public void run() {
while(num>0){//循环卖所有的票
if(num>0){//卖一张票
System.out.println("您的票号是:"+num);
num--;
}
}
}

}

测试主类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.ifueen.classdemo._05Runnable;

public class _05Test {
/*
* 1.线程的第二种实现方式,自定义类 implements Runnable
*
* 2.注意:接口实现方式,字段,没有加static也已经共享了,因为我们只创建了一个mt对象
*
*
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
_05MyThread mt = new _05MyThread(); //实例化自定义对象

Thread t1 = new Thread(mt); //新建线程并传入自定义对象
Thread t2 = new Thread(mt);
Thread t3 = new Thread(mt);

t1.start(); //启动线程
t2.start();
t3.start();
}

}

这就是线程最基本的概念和实现方式,下一篇我们会了解到线程同步问题

❤赏点钱让我买杯快乐水8❤