概念:
Java多线程的重要性不言而喻,不管是平时开发还是面试问题,多线程始终作为很看重的一点,那么我们来看看多线程到底是怎么样的吧
说到线程就不得不提到进程
进程和线程
进程:可以看作一段代码,一个正在运行的程序
线程:可以堪称计算机运行中的一小块代码
线程是进程中的最小单位
进程的概念:
任务管理器可以有多个进程,每个进程运行的都是可执行程序,一个可执行程序就是一个软件,可执行程序的本质就是在计算机当中运行的一块代码
线程的作用:
它包装了一个功能,交给CPU去进行处理
1.独立使用CPU资源
2.每一个线程都是独立存在的,互不干扰
自定义线程
新建自定义线程的类,继承Thread,然后覆写run方法实现想要的功能,再到主方法里面去调用,文最末尾附上Demo
注意事项
直接调用run方法和start的区别?
- 可以直接调用run方法,但是没有启动一个独立的线程;
- 只有调用start 才回启动一个独立的线程;
自己启动的线程和主线程有关系吗?
直接写一个最简单的hello word 程序,就有一个主线程
一个线程一旦启动就是独立的了,和创建启动它的环境没有直接的包含关系
实现方式
继承Thread实现
实现方式一
自定义类继承Theard来进行创建,覆写run方法,然后在主方法中调用对象.start();方法启动
引入Runnable实现
实现方式二
自定义类implements Runnable接口,覆写run方法,在主方法中实例化自定义类的对象和Thread对象,在实例化Thread对象的时候传入自定义类的对象,然后Thread对象.start()来启动
Demo
Thread实现
自定义听音乐线程类
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+"次");
}
}
}
自定义玩游戏线程类
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+"次");
}
}
}
测试主类
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实现
自定义线程类
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--;
}
}
}
}
测试主类
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();
}
}
这就是线程最基本的概念和实现方式