线程简介(一)

线程简介

线程的存在就是充分使用CPU资源。

线程的五种状态

新建、就绪、运行、阻塞、死亡

新建

当程序通过new关键字创建一个线程之后,该线程就处于新建状态

线程的创建方式有三种:

  • 继承Thread类创建线程类,重写run方法。
  • 实现Runnable接口
  • 实现Callable接口 该方式有返回值

就绪

当线程对象调用start() 方法,该线程就进入就绪状态。该状态线程并没有开始运行,只是表示该程序可以运行了。

注意事项:

调用start()启动线程而不是run。

如果直接调用run()系统会把run当成普通方法去执行,系统把线程让程一个普通对象,无法并发执行。

运行

当线程得到CPU资源就进入运行状态。

阻塞

线程进入阻塞状态的情况:

  • 线程调用sleep()方法主动放弃所占用的处理器资源
  • 线程调用了一个阻塞IO方法,在该方法返回之前,该线程被阻塞 如:读操作
  • 线程试图获得一个同步监视器,但监视器正在被其他线程对象所持有。 如:同步代码块
  • 线程等待某个通知(notify) 线程调用wait方法,线程进入挂起状态。
  • 程序调用suspend()方法线程将被挂起。但这个方法容易导致死锁。

线程解除阻塞状态【重新进入就绪状态】:

  • sleep()方法过了指定时间,睡眠时间结束
  • 阻塞IO方法已经返回
  • 该线程成功获得监视器资源
  • 线程等待通知时,接收到一个通知 。 notify/notifyAll
  • 线程调用resume恢复方法

死亡

线程死亡后,调用start()方法无法重新启动,死亡就是死亡

线程死亡的三种方式:

  • 线程执行结束
  • 线程抛出一个未捕获的异常
  • 调用stop() 结束线程,但是容易导致死锁

线程实现方式一:继承Thread类

/**
 * @Author YangHe
 * @Date 2020/4/7 11:52
 */
public class ThreadTest extends Thread {
    private int j;
    public ThreadTest(String name){
            super(name);
    }
    public ThreadTest(ThreadGroup threadGroup,String name){
        super(threadGroup,name);
    }
    @Override
    public void run() {

            for(;j<100;j++){
                System.out.println(getName()+"       "+j +" "+getThreadGroup().activeCount()); //显示该线程组活跃的线程数
                if(j==50){
                    Thread.yield();       //当变量值为50 放弃当前资源  进入就绪状态
                  /*  try {
                        Thread.sleep(1000); //当变量值为50 睡眠一秒 进入阻塞状态
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }*/
                }
            }
    }

    public static void main(String[] args) {
        ThreadTest t=new ThreadTest("6666666666");
        t.setDaemon(true);//该线程设置为后台线程,所有线程结束该线程结束
        t.start();
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"  "+i);
            if(i==20){
                ThreadGroup threadGroup=new ThreadGroup("测试");//新建线程组 ,设置线程组名称
                ThreadTest t1=new ThreadTest(threadGroup,"杨贺");
                ThreadTest t2=new ThreadTest("李小艺");
                t1.start();
                t2.start();
            }
        }
    }
}

线程实现方式二:实现Runnable接口

/**
 * @Author YangHe
 * @Date 2020/4/7 11:52
 */
public class RunnableTest implements Runnable{
    private int j;
    @Override
    public void run() {
        for(;j<100;j++){
            System.out.println(Thread.currentThread().getName()+"       "+j);
        }
    }
    public static void main(String[] args) {
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"  "+i);
            if(i==20){
                RunnableTest r=new RunnableTest();
                new Thread(r,"杨贺").start();
                new Thread(r,"李小艺").start();
            }
        }
    }
}

线程实现方式三:实现Callable接口

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * @Author YangHe
 * @Date 2020/4/7 15:47
 */
public class CallableTest implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int i=0;
        for(;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"  "+i);
        }
        return i;
    }

    public static void main(String[] args) throws InterruptedException {
        CallableTest callableTest=new CallableTest();
        FutureTask<Integer> task=new FutureTask<Integer>(callableTest);
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"循环变量的值为 "+i);
            if(i==20){
                Thread t1=new Thread(task,"李小艺");
                t1.start();
                t1.join(); //等待该线程执行完成,主线程再执行
            }
        }
        try{
            System.out.println("子线程的返回值为 "+task.get());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

原文地址:https://www.cnblogs.com/yanghe123/p/12660474.html

时间: 2024-11-10 11:21:45

线程简介(一)的相关文章

[python] 线程简介

参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了

LINUX线程简介和简单代码案例

0x00.什么是线程 是计算机中独立运行的最小单位,运行时占用很少的系统资源.可以把线程看成是操作系统分配CPU时间的基本单元.一个进程可以拥有一个至多个线程.它线程在进程内部共享地址空间.打开的文件描述符等资源.同时线程也有其私有的数据信息,包括:线程号.寄存器(程序计数器和堆栈指针).堆栈.信号掩码.优先级.线程私有存储空间 0x01.为什么使用线程 在某个时间片需要同时执行两件或者两件以上的事情 0x02.怎么使用线程 A. 使用到的函数 int pthread_create(pthrea

Android ActivityThread(主线程或UI线程)简介

1. ActivityThread功能 它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IApplicationThread接口,AMS为Client.ActivityThread.ApplicationThread为Server)负责调度和执行activities.broadcasts和其它操作. 在Android系统中,在默认情况下,一个应用程序内的各个组件(如Activity.BroadcastReceiver.Service)都会在同一个

11.1 线程简介

我们已经中讨论了进程,我们学习了UNIX进程的环境,进程间的关系,控制进程的方法,进程间的关系:同时我们也看到进程间共享的资源时非常少的. 在本章中,我们将学习如何使用多线程控制来实现单个进程环境内执行多个线程,所有单个进程内的线程都有权限访问相同的进程组件,比如说文件描述符以及内存. 任何是否你只要在多个用户之间共享文件的话,你就必须处理好一致性.我们将在本章最后多线程处理它们之间共享资源一致性的同步机制. 来自为知笔记(Wiz)

Delphi线程简介和它的create方法

TThread在Classes单元里的声明如下 type TThread = class private FHandle: THandle; FThreadID: THandle; FTerminated: Boolean; FSuspended: Boolean; FFreeOnTerminate: Boolean; FFinished: Boolean; FReturnValue: Integer; FOnterminate: TNotifyEvent; FMethod: TThreadMe

Qt 学习之路 :线程简介

现代的程序中,使用线程的概率应该大于进程.特别是在多核时代,随着 CPU 主频的提升,受制于发热量的限制,CPU 散热问题已经进入瓶颈,另辟蹊径地提高程序运行效率就是使用线程,充分利用多核的优势.有关线程和进程的区别已经超出了本章的范畴,我们简单提一句,一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理. Qt 使用QThread 来管理线程.下面来看一个简单的例子: C++ 1 2 3 4 5 6 7 8

SylixOS 下内核线程简介

1.概述 内核线程共享内核所有资源,例如内核文件描述符表,而进程内线程则共享使用进程内所有资源,例如进程文件描述符表.SylixOS对于一些系统级功能是通过使用内核线程进行管理使用. 2.内核线程 基于SylixOS的1.5.3的内核,在终端上输入命令"ts"如图 2.1所示. 图2.1  "ts"命令 2.1 内核线程工程 SylixOS的内核线程功能以及能否裁剪如图 2.2所示. 图2.2  SylixOS内核线程功能 有些平台因为不需要使用某些内核功能可以通过

1.0-并发编程-进程和线程简介

进程进程是资源(CPU.内存等)分配的基本单位,它是程序执行时的一个实例.程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行. 线程线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量.线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行.同样多线程也可以实现并发操作,每个请求分配一

线程概念简介 什么是线程 多线程上篇(七)

操作系统为了程序的并发执行引入了进程的概念,提高了资源的利用率以及吞吐量. 在20世纪 60年代人们提出了进程的概念后,在OS中一直都是以进程作为能拥有资源和独立运行的基本单位的. 直到 20 世纪 80 年代中期,人们又提出了比进程更小的能独立运行的基本单位——线程(Threads) 试图用它来提高系统内程序并发执行的程度,从而可进一步提高系统的吞吐量. 简言之,进程的概念,使之能够并发执行多道程序,线程的概念让你更好地并发执行程序,一个是能不能的问题,一个是更好的问题. 线程与进程对比 线程