没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
序号 进程与线程的联系
(1) 一个进程最少拥有一个线程--主线程--- 运行起来就执行的线程
(2) 线程之间是共享内存资源的(这个内存资源是由进程申请的)
(3) 线程之间可以通信(进行数据传递:多数为主线程和子线程)
JAVA多线程入门
B站 IT楠老师 ,公众号: IT楠说java ,QQ群: 1083478826
一、进程和线程
1、进程
是一个正在执行中的程序就是一个进程,系统会为这个进程发配独立的内存资源。
例如:正在运行的 QQ、IDE、浏览器就是进程
2、线程
具体执行任务的最小单位 ,一个进程中至少有一个线程。
2.1 进程与线程的联系
2.2 创建子线程的原因
如果在主线程中存在有比较耗时的操作(例如:下载视频、上传文件 数据处理) 这些操作会阻塞主线
程,后面的任务必须等这些任务执行完毕之后才能执行,用户体验比较差, 为了不阻塞主线程,需要将
耗时的任务放在子线程去处理。
2.3 创建线程的方法
创建线程有两种方法
2.3.1 继承Thread类实现run方法
步骤:
① 定义类继承Thread;
② 重写Thread类中的run方法;(目的:将自定义代码存储在run方法,让线程运行)
③ 调用线程的start方法:(该方法有两步:启动线程,调用run方法)
方法 作用
join()
让当前这个线程阻塞 等join()的线程执行完毕再执行
setName()
设置线程名称
getName()
获取线程名称
currentTHread()
获取当前运行的线程对象
上面一段demo中所用到的方法如下:
2.3.2 实现Runnable接口
注意事项: 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参
方法。
步骤: ① 创建任务: 创建类实现Runnable接口 ② 使用Thread 为这个任务分配线程 ③ 开启任
务
Start()
使用方式1---创建一个类实现Runnable接口,使用Thread来操作这个任务
/**
* @author IT楠老师
* @date 2020/6/17
*/
public class UseThread {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
new MyTask().start();
System.out.println(3);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(4);
}
static class MyTask extends Thread{
@Override
public void run() {
System.out.println("这是通过继承实现的多线程!");
}
}
}
2.3.3 使用Lammbda表达式
2.4.4 有返回值的线程
/**
* @author IT楠老师
* @date 2020/6/17
*/
public class UseRunnable {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
new Thread(new Task()).start();
System.out.println(3);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(4);
}
static class Task implements Runnable{
public void run() {
System.out.println("这是我的第一个线程方法");
}
}
}
new Thread(()->{
for(int i=0;i<=100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}).start();
/**
* @author IT楠老师
* @date 2020/6/17
*/
public class UseCallable {
public static void main(String[] args) throws Exception {
System.out.println(2);
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Task());
System.out.println(3);
new Thread(futureTask).start();
System.out.println(4);
int result = futureTask.get();
System.out.println(5);
System.out.println(result);
System.out.println(6);
}
2.4 线程生命周期
一个线程的生命周期中,总共有以下6种状态
NEW - 这个状态主要是线程未被Thread.start()调用前的状态。
RUNNABLE - 线程正在JVM中被执行,它可能正在等待来自操作系统(如处理器)的其他资源。
BLOCKED - 线程被阻塞等待一个monitor锁,处于阻塞状态的线程正在等待monitor锁进入
synchronized的代码块或方法,或者在调用Object.wait()方法后重新进入synchronized的代码块
或方法。
WAITING - 由于线程调用了
Object.wait(0)
,
Thread.join(0)
和
LockSupport.park
其中
的一个方法,线程处于等待状态,其中调用
wait
,
join
方法时未设置超时时间。还有一种情况,
处于等待状态的线程正在等待另一个线程执行特定的操作,比如:一个线程调用了
Object.wait()
后,等待另一个线程调用
Object.notifyAll()
或
Object.notify()
方法;
或一个线程调用了
Thread.join()
方法,等待自己的线程的结束。
TIMED_WAITING - 线程等待一个指定的时间,比如线程调用了
Object.wait(long)
,
Thread.join(long)
,
LockSupport.parkNanos
,
LockSupport.parkUntil
方法之后,线程
的状态就会变成TIMED_WAITING
TERMINATED - 终止的线程状态,线程已经完成执行。
Java线程的生命周期
static class Task implements Callable<Integer> {
public Integer call() throws Exception {
Thread.sleep(2000);
return 1;
}
}
}
join
/**
* @author IT楠老师
* @date 2020/6/30
*/
public class Test {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 0; i<10 ; i++) {
ThreadUtils.sleep(10);
System.out.println("这是线程1-----"+i);
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i<100 ; i++) {
ThreadUtils.sleep(10);
System.out.println("这是线程2-----"+i);
}
});
t1.start();
t2.start();
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("-------------------------------------------------");
ThreadUtils.sleep(100000);
剩余35页未读,继续阅读
资源评论
我要修改昵称
- 粉丝: 8
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功