Java语言中的多线程

2019-08-19  本文已影响0人  黑铁选手

目的

熟练的掌握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

今天学习的线程,简单但是挺重要的,简单的东西都会被忽略掉,现在学的这些只是还没到用的时候,所以都是不怎么懂,我想等到了下一个阶段,我应该会掌握的更牢固。

上一篇下一篇

猜你喜欢

热点阅读