Java语言中的多线程
目的
熟练的掌握Java语言的进程,线程,多线程。学会运用
相关技术,及其使用
1、进程:正在运行的一个程序,系统会为这个进程分配独立的内存空间
2、线程:具体执行任务的最小单位,一个进程多少拥有一个线程(主线程 运行起来就要执行的线程 )。
(1)线程之间是共享内存资源的(进程申请的内存资源),一个线程就是独立完成一个任务。
(2)线程之间可以通信(数据传递)但是多数情况下为主线程和子线程之间的通讯
(3)每一个线程都有自己的运行回路(生命周期)
(4)每次线程运行的结构都是不唯一的
3、线程的生命周期(线程的状态)
NEW:新建 线程刚被创建好
RUNNABLE:就绪状态 只要抢到时间片就可以运行这个程序
BLOCKED :阻塞状态 sleep 时间片结束 wait sleep时间结束notify就重新回到就绪状态
WAITING:等待 wait
TIMED_WAITING
TERMINATED : 终止
4、为什么需要创建子线程
(1)如果在主线程中存在比较耗时的操作:下载视频 上传文件 数据处理
(2)这些操作会阻塞主线程,后面的任务必须等这些任务执行完毕之后才能执行,用户的体验比较差
(3 为了不阻塞主线程,需要将好事的任务存方法子线程中去处理
5、如何创建一个子线程
(1)协议类继承于Thread 实现run方法
(2)实现Runnable接口 实现run方法:
a、创建任务 创建类实现Runnable接口
b、使用Thread 为这个任务分配线程
c、开启任务start
class PXDThread implements Runnable {
public void run() {
for(int i = 1;i <=100;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
//创建Thread对象开启任务
//main 方法里面执行的代码都是在主线程里面执行的
TestThread tt = new TestThread();
tt.start();
6、操作线程里面所需的方法
(1)join:让当前这个线程阻塞 等join的线程执行完毕在执行
(2)setName:设置线程名称
//创建Thread对象
TestThread tt = new TestThread();
//设置线程的名称
tt.setName("子线程");
(3)getName:获取线程名称
String name= Thread.currentThread().getName();
(4)currentThread:获取当前运行的线程对象
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1;i <=100;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
});
(5)start:开启线程
Thread t2 = new Thread(pt);
t2.setName("子线程2");
t2.start();//开启任务
7、线程安全
Synchronized、线程同步
Lock 加锁解锁
ReentraintLock 可重入锁
任何一个对象都有自己的一把锁,如果多个线程操作同一个代码块,必须需要同步,那么必须操作同一哥对象/同一把锁。
方法:
(1)同步代码块
synchronized(监听器、对象、锁){
需要同步的代码
}
test();
public synchronized void test() {
for (int i = 1; i <= 100; i++) {
//需要同步的代码
if (num > 0) {
System.out.println(name + "出票:" + num);
num--;
} else {
break;
}
}
(2)同步方法
必须确保多个对象调用的同方法时操作的同一个对象
public synchronized void test() {
本质就是同步代码块
等价于
synchronized(this){
test();
}
8、线程之间的通讯:
synchronized (wait notify notifyAll)
ReentrantLock lock;
Condition c =lock.newCondition()
await single singleAll
ps
今天学习的线程,简单但是挺重要的,简单的东西都会被忽略掉,现在学的这些只是还没到用的时候,所以都是不怎么懂,我想等到了下一个阶段,我应该会掌握的更牢固。