线程

作者: wustzhy | 来源:发表于2020-05-23 06:28 被阅读0次

线程初始化后的状态:可运行/就绪状态、(抢占到CPU)运行状态、(等待)阻塞状态、(运行完毕)死亡状态

实现

实现线程 方式一 (继承)

run()方法称为 线程体

public class FirstThread extends Thread {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        
        for (int i = 0; i < 100; i++) {
            System.out.println("first thread" + i);
        }
    }
}

使用

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        FirstThread fThread = new FirstThread();
        fThread.start();
        
        for (int i = 0; i < 100; i++) {
            System.out.println("main thread ------ " + i);
        }
    }

运行结果

main thread ------ 0
first thread0
main thread ------ 1
first thread1
main thread ------ 2
first thread2
main thread ------ 3
main thread ------ 4
...

自定义线程 之外,还有主线程、垃圾回收线程。
其中 自定义线程、主线程抢占CPU,交替运行

实现线程 方式二 (实现接口)

public class RunnableImpl implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("impl do sth");
    }
}

RunnableImpl ri = new RunnableImpl();
Thread thread = new Thread(ri);
thread.start();

线程控制

  • 中断线程

sleep:中断当前线程 [阻塞/休眠状态]

Thread.sleep(2000);//2000ms

那什么时候运行呢?
2000ms后[就绪] + 抢占CPU耗时n后 ->[运行状态]

yield,暂停当前正在执行的线程对象,并让步给其它线程(有机会)执行

 Thread.yield();

什么时候运行?
瞬间中断 -> 抢占资源 -> 运行
有这样的结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果(因为让步的线程还有可能被线程调度程序再次选中)。

  • 设置优先级
thread.setPriority(Thread.MAX_PRIORITY);
thread.setPriority(Thread.MIN_PRIORITY);

默认是5,max:10, min:1
尽管设置了优先级,也并不一定总是优先级高的抢占到CPU,只是概率相对更高一些

多线程数据安全

定义MyThread类,线程体

public class MyThread implements Runnable{
    @Override
    public void run() {
        // TODO Auto-generated method stub
        
        while (true) {
            System.out.println(Thread.currentThread().getName() + i);
            i--;
            Thread.yield();
            if (i < 0) {
                break;
            }
        }
    }
}

多个线程、同一个线程体,运行

static void multiThread() {
    MyThread m = new MyThread();
    Thread t1 = new Thread(m);
    Thread t2 = new Thread(m);
    t1.setName("线程A");
    t2.setName("thread B");
    t1.start();
    t2.start();
}

运行结果

/*  ...
 *  thread B96
    thread B95
    线程A95
    thread B94
    线程A93
    ...
 * */

多线程共用同一份资源(数据)时,操作数据时发生 B95->A95 这样的现象。相当于12306卖票时,同一份票被卖给了2个用户。

使用synchronized,可对共享数据加锁保护

while (true) {
            
    //自动释放锁synchronized,用于多线程中对共享数据保护
    synchronized (this) {
        System.out.println(Thread.currentThread().getName() + i);
        i--;
        Thread.yield();
        if (i < 0) {
            break;
        }
    }
}

不再发生B95->A95这样数据不安全的现象

若A线程拿到这个锁后,执行锁住的代码块。若A还没执行完,此时若B抢占到CPU,B因为没拿到该锁,所以无法使用锁内代码,直到A释放锁,B才有机会拿到锁,才可以在抢占到CPU后执行锁内代码.

相关文章

  • Android

    线程间通信 主线程和工作线程主线程和工作线程 工作线程与工作线程工作线程与工作线程 为什么主线程Looper.lo...

  • 三、操作系统之线程

    前言 什么是线程 引入线程的原因 线程的概念 线程和进程的关系 线程结构 线程有点 多线程模型 用户线程和内核线程...

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • 总结多线程与设计模式+synchronized+性能+高吞吐+死

    Java线程 Java语言的线程 何谓线程 线程启动 线程的暂时停止 线程的共享互斥 线程的协调 线程的状态转移 ...

  • 多线程编程

    摘要 线程概念,线程与进程的区别与联系学会线程控制,线程创建,线程终止,线程等待了解线程分离与线程安全学会线程同步...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java并发之守护线程

    java中有两种线程,用户线程和守护线程用户线程:主线程停止时,用户线程不会停止守护线程:主线程停止时,守护线程也...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • 线程基础知识

    线程学习 线程的基础知识 线程是什么? 线程和进程的关系 线程的6个状态 线程优先级 主线程、多线程、后台线程的概...

  • 多线程介绍

    一、进程与线程 进程介绍 线程介绍 线程的串行 二、多线程 多线程介绍 多线程原理 多线程的优缺点 多线程优点: ...

网友评论

      本文标题:线程

      本文链接:https://www.haomeiwen.com/subject/lznhahtx.html