JAVA基础 多线程
多线程就是多任务执行,多路径执行。如果没有多任务执行的需求,就不需要多线程。
多线程的优点:
资源利用率更好
效率更高
多线程的缺点:
程序设计复杂
需要考虑可能会出现的数据不安全情况
线程和进程:
进程:每个进程都有独立的代码和数据空间(进程上下文)
进程间的切换会有较大的开销
一个进程包含1~n个线程
资源分配的最小单位
线程: 线程之间开销小
多个|一类线程共享进程的代码和数据空间
每个线程有独立运行栈和程序计数器(PC)
轻量级的进程
cpu调度执行的最小单位
并发和并行
并行一定是并发,而并发不一定是并行,也可能是串行
并发: 一个时间段内,程序拥有处理多任务的能力
并行: 一个时间段内,程序拥有同时处理多任务的能力
多线程目标
创建与开启
线程状态
线程安全
线程通信
线程的创建方式:
1.继承Thread类,重写run()方法,方法内定义线程体 + start()
先定义一个类,继承Thread类,然后重写run方法。之后在主函数中调用新建对象,调用其start方法。
public class ThreadDemo01 extends Thread {
/*
定义线程体
*/
@Override
public void run() {
for(int i = 1;i<=20;i++){
System.out.println("一边敲代码..");
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//创建一个线程
ThreadDemo01 th = new ThreadDemo01();
//开启线程
//th.run(); 方法的调用
th.start(); //开启线程 jvm调用run()方法
//默认主线程
for(int i = 1;i<=20;i++){
System.out.println("陪女朋友聊天..");
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2.实现Runnable接口 ,重写run()方法,方法内定义线程体 + start() -->推荐
上面第一种如果继承Thread后,就不能再继承其他类了,而接口是可以多实现的,因此是建议使用Runnable接口。
使用:实现Runnable接口后,创建实现类的对象,(因为start是Thread的方法,所以…)创建Thread的对象,使用Thread的start方法。
public class ThreadDemo02 implements Runnable{
@Override
public void run() {
for(int i = 1;i<=20;i++){
System.out.println("一边打游戏..");
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//创建线程
ThreadDemo02 th = new ThreadDemo02();
Thread t = new Thread(th);
//开启线程
t.start();
for(int i = 1;i<=20;i++){
System.out.println("一边陪女朋友..");
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Thread.sleep(2);是执行完后停2毫秒,因为我们所写的程序代码不是很多,系统会一下子就执行完毕,停2毫秒,可以让我们更好的看出多线程的作用。
3.Callable接口,重写call方法,方法中定义线程体–>了解
call()可以抛出异常,可以存在返回值
run()不能抛出异常,不能存在返回值