[每日一练] java 2020.8.1 线程专题总结

[每日一练] java 2020.8.1 线程专题总结

  • 一.进程和线程:
  • 二.线程的创建
    • 1.线程组
        • (1)ThreadGroup的构造函数:
        • (2)ThreadGroup 的方法
          • 1. Runnable接口
          • 2.Thread 类
            • (1)Thread 中的方法:
            • (2)Thread 的成员方法
            • (3)Thread 中的静态成员方法
          • 3.继承Thread 方法创建线程
          • 4.实现Runnable 接口创建线程
  • 三.线程的状态
  • 四.线程的控制
  • 五.线程的优先级

题目:

  1. 高优先级的线程比低优先级的线程运行得更快。
    A.对
    B.错

    正确答案: B

一.进程和线程:

  1. 进程:是一个具有一定的独立功能的程序在一个数据集合上的一次动态之星进程。进程是存储器,外设等资源的分配单位,也是处理器的调度对象。

  2. 线程是JVM的调度的最小单元(比进程更小的运行单元),也是轻量级的进程,每个进程由很多个线程组成。

  3. 为什么要使用多线程呢? 提高资源的利用效率,也就是等价于提高运行速率。因为同一个时刻,一个线程只能运行在一个CPU上面。

  4. 多线程的几种状态:就绪态,运行态,死亡态,阻塞态,等待态。

二.线程的创建

–通过对Thread 类的继承 或者对Runnable 接口的实现
Thread 类用来创建和控制线程。一个线程要从run()方法开始执行,run() 方法的声明在 java.lang.Runnable接口中。每个程序中至少有一个主线程。

1.线程组

线程组:把多个线程集合为一个对象。 java.lang.ThreadGroup类实现了线程组的创建和对线程组的操作。

(1)ThreadGroup的构造函数:

public ThreadGroup(String name)
eg: 创建一个名字为name 的线程组
public ThreadGroup(ThreadGroup parent,String name)

(2)ThreadGroup 的方法

public final String getName() //返回线程组的名字
public final ThreadGroup getParent() //返回线程组父线程组
public int activeCount() //返回当前线程组活动线程的个数
public int enumerate(ThreadGroup list[]) //将线程组中的线程复制到另外一个线程组中

1. Runnable接口

在Runnable接口中,只声明了一个run()方法: public void run();

这个方法必须在一个对象中实现,已经实现的run()方法称为这个对象的线程体。创建线程之后,run()方法会被自动调用。

2.Thread 类

– 在Thread类中,run()方法会被实现为空方法,

Thread 类的声明格式如下:
public class Thread extend Object implements Runnable

(1)Thread 中的方法:

1.Thread ( )
2.Thread (String name)
3.Thread (Runnable target)
4.Thread (Runnable target, String name)
5.Thread (ThreadGroupgroup, Runnable target)
6. Thread (ThreadGroupgroup, String name)
7.Thread (ThreadGroupgroup, Runnable target, String name)

name: 线程名,可以通过Thread类的setName方法设置。
**group:**线程所在的线程组的名字。
**taget :**执行线程的目标对象,实现了Runnable接口中的run() 方法

(2)Thread 的成员方法

public final String getName() //返回线程名
public final void setName() //设置线程名
public void start() //启动线程
public final Boolean isAlive() //检查线程是否已经创建
public String toString() //以字符串的形式得到线程名,优先级等线程组中的信息
public final ThreadGroup getThreadGroup() //返回线程组

(3)Thread 中的静态成员方法

public static Thread currentThread() //返回当前执行的线程对象
public static int activeCount() //返回当前线程组中活动的线程个数
public static int enumerate(Thread[] a) //将线程中的活动线程复制到数组a中

3.继承Thread 方法创建线程
package cn.xyp.xc;
//循环产生5个字母
public class Thread_1  extends Thread{
	char c;
	public Thread_1(String name,char c) {
		super(name);
		this.c=c;
	}
	//因为在Thread 中run() 为空方法,此处重写 run() 方法
	public void run() {  
		char ch= c;
		System.out.println("run()启动");
		System.out.println(getName()+":");//返回构造方法的名字
		for (int i =0;i<5;i++) {
			ch=(char)(c+i);
			System.out.println("这是ch:"+ch+"");
		}
		System.out.println(getName()+"end"); //返回线程的名字
	}
	
	public static void main(String[] args) {
		Thread_1 th1 = new Thread_1("th1", 'A');
		Thread_1 th2 = new Thread_1("th2", 'a'); //创建两个线程
		th1.start();
		th2.start();
		System.out.println("当前线程个数为:"+Thread.activeCount());
	}
}

运行结果:
[每日一练] java 2020.8.1 线程专题总结_第1张图片
??为什么当前线程数目为3???
因为main() 方法也是一个线程(主线程),所以Thread.activeCount()的返回值为3!
???为什么我每次运行的结果都不一样???
因为3个线程同时作为处理器的调度对象,线程中的指令被交替执行

4.实现Runnable 接口创建线程
package cn.xyp.xc;
//多线程 循环产生5个字母
public class Runnable_1 implements Runnable{
	char c;
	public Runnable_1(char c) {
		this.c=c;
	}
	//因为在Thread 中run() 为空方法,此处重写 run() 方法
	public void run() {  
		char ch= c;
		System.out.println("run()启动");

		for (int i =0;i<5;i++) {
			ch=(char)(c+i);
			System.out.print("这是ch:"+i+" "+ch+"");
		}
	}
	public static void main(String[] args) {
		Runnable_1 th1 = new Runnable_1('A');
		Runnable_1 th2 = new Runnable_1('a'); //创建两个线程
		//Runnable_1 实现了接口Runnable 的 run() 方法,他不是Thread 的子类,所以 th1,th2,不是线程对象,而是目标对象
		//下面语句就是以 th1,th2为目标对象 ,创建线程对象
		Thread ca1 = new Thread(th1);
		Thread ca2 = new Thread(th2);
		ca1.start();
		ca2.start();
		System.out.println("当前线程个数为:"+Thread.activeCount());
	}
}

运行截图:
在这里插入图片描述

三.线程的状态

1.创建转态: new 运算符创建线程,此时还是一个空对象,没得到系统的资源
2.可运行状态(runnable): start() 启动一个线程,系统分配除了处理器之外的资源
3.运行中的状态(running): 执行run()方法
4.阻塞状态(not runnable): 因某种原因使得运行中的线程无法继续运行,若在执行时被中断,该线程下次运行时,将会从原来的终止处继续运行
5.死亡状态:线程运行结束后自动进入。 两种导致线程死亡的情况:自然撤销或被停止

四.线程的控制

1.sleep() --使线程进入睡眠
public static void sleep(long millis) throws InterruptedException
其中 milllis 指的睡眠时间
2.yield() --暂停线程
public static void yield()
暂停执行时,但依旧处于可运行状态。系统选择同优先级线程运行,当没有的时候,会继续执行该线程
3.join() --暂停线程执行,直到调用该方法的线程执行结束后继续执行
public final void join() throws InterruptedException
public final void join(long millis) throws InterruptedException
其中:millis 为等待时间
4.wait() --线程进入阻塞状态
5.notify() --唤醒线程
6.中断线程的方法:

public void interrupt()
public void boolean isInterrupted()
public static boolean interrupted()
interrupt() 为线程提供一个中断标记,静态方法interrupted() 检测线程是否被中断,如果是,就清除中断标记,并返回ture

五.线程的优先级

用 1-10 的整数表示,最低为1,最高为10 ,默认优先级为5
表示方法:

public static final int NORM_PRIORITY =5
public static final int MIN-PRIORITY =1
public static final int MAX-PRIORITY =10
也可以用getPriority()获得线程优先级
public final int getPriority()
public final setPriority(int newPriority)

线程的调度: 负责线程排队以及CPU 在线程之间的分配

不足之处,还望指正 谢谢大家

你可能感兴趣的:(Java)