javaSE---多线程02

30 篇文章 0 订阅
4 篇文章 0 订阅
本文详细介绍了Java中线程的操作方法,包括启动线程、获取和设置线程名称、优先级以及守护线程的设置。同时,讨论了线程的生命周期,包括新建、就绪、运行、阻塞和死亡状态。文中通过实例展示了如何使用这些方法,并解释了线程状态之间的转换。
摘要由CSDN通过智能技术生成

多线程2

10.3.线程中的常用操作方法
Java.lang.Thread类【线程类】

voidstart() 启动线程
static ThreadcurrentThread()得到当前正在运行的线程对象
StringgetName()返回该线程的名称。
voidsetName(String name)设置线程名称1.当没有设置线程名称的时候,系统会赋予线程一个默认的名称“Thread-0,Thread-1…”2.2. 主线程【主方法的执行线程】的名称默认是“main”

例如:

package com.wangxing.threadmehod1;

public class TestThread implements Runnable{

	@Override
	public void run() {
		//循环输出1-100整数
		//static Thread currentThread()得到当前正在运行的线程对象
		Thread th=Thread.currentThread();
		//String	getName()返回该线程的名称。
		String stuname=th.getName();
		for(int i=0;i<=100;i++){
			 System.out.println(stuname+"---i="+i);
		}
	}
	
}

测试类:

package com.wangxing.threadmehod1;

public class TestMain {

	public static void main(String[] args) {
		//目标对象
		TestThread testthread=new TestThread();
		//线程对象
		Thread th1=new Thread(testthread);
		Thread th2=new Thread(testthread);
		//void  setName(String name)设置线程名称
		th1.setName("线程1");
		th2.setName("线程2");
		//启动线程
		th1.start();
		th2.start();
		//主方法的线程名称默认main
		String name=Thread.currentThread().getName();
		System.out.println("主线程名称=="+name);
		
	}

}

intgetPriority() 返回线程的优先级。
voidsetPriority(int newPriority) 更改线程的优先级。

线程的优先级–就是线程的执行先后。

  1. 线程的优先级有10个级别,分别使用整数1~10来表示。
    为了方便操作,java将10个级别有规定成3个级别,分别是最低的优先级,中等优先级,最高的优先级,并且将这3个级别封装成了静态常量
static intMAX_PRIORITY 线程可以具有的最高优先级。10
static intMIN_PRIORITY线程可以具有的最低优先级。1
static intNORM_PRIORITY分配给线程的默认优先级。5
  1. 设置线程的优先级的时候,数字越大优先级越高,数字越小优先级越低。优先级越高并代表就一定会优先执行,只是被优先执行的几率增大,因此不要试图通过控制线程的优先级,来保证某一个线程,总是第一个执行。
  2. 所有线程默认的优先级都是5【中等级别】
    例如:
package com.wangxing.threadmehod2;

public class TestThread implements Runnable{

	@Override
	public void run() {
		//循环输出1-100整数
		//static Thread currentThread()得到当前正在运行的线程对象
		Thread th=Thread.currentThread();
		//String	getName()返回该线程的名称。
		String stuname=th.getName();
		for(int i=0;i<=100;i++){
			 System.out.println(stuname+"---i="+i);
		}
	}
	
}

测试类:

package com.wangxing.threadmehod2;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
import javax.swing.text.html.MinimalHTMLWriter;

public class TestMain {

	private static final int MaximizeAction = 0;
	private static final int MinimalHTMLWriter = 0;

	public static void main(String[] args) {
		//目标对象
		TestThread testthread=new TestThread();
		//线程对象
		Thread th1=new Thread(testthread);
		Thread th2=new Thread(testthread);
		//void  setName(String name)设置线程名称
		th1.setName("线程1");
		th2.setName("线程2");
		//修改线程优先级
//		th1.setPriority(8);
//		th2.setPriority(7);
		//或者
		th1.setPriority(Thread.MAX_PRIORITY);
		th2.setPriority(Thread.MIN_PRIORITY);
		Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
		//int getgetPriority() 返回线程的优先级。
		//所有线程默认优先级为5
		System.out.println(th1.getName()+"优先级:"+th1.getPriority());
		System.out.println(th2.getName()+"优先级:"+th2.getPriority());
		
		//主方法的线程名称默认main
		String name=Thread.currentThread().getName();
		System.out.println("主线程名称=="+name);
		int pri=Thread.currentThread().getPriority();
		//主线程的优先级
		System.out.println(name+"优先级:"+pri);
		//启动线程
		th1.start();
		th2.start();
	}

}

在这里插入图片描述
守护线程的相关操作方法
通常情况之下我们所创建的线程都是普通线程,非守护线程,也叫用户线程。
守护线程,也叫精灵线程【当所有用户线程都执行完毕以后,自动结束运行的线程就是守护线程】
特征:当所有用户线程都执行完毕以后,无论守护线程能否可以继续运行,都要立刻停止运行。
例如:不是同年同月同日生,但是一定会同年同月同日死【共死/陪葬】

booleanisDaemon() 测试该线程是否为守护线程。
voidsetDaemon(boolean on) 将该线程标记为守护线程用户线程。

例如:

package com.wangxing.threadmehod3;

public class TestThread implements Runnable{

	@Override
	public void run() {
		//循环输出1-100整数
		//static Thread currentThread()得到当前正在运行的线程对象
		Thread th=Thread.currentThread();
		//String	getName()返回该线程的名称。
		String stuname=th.getName();
		for(int i=0;i<=100;i++){
			//设置线程0.4秒执行一次
			try {
				Thread.sleep(400);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(stuname+"---i="+i);
		}
	}
	
}

package com.wangxing.threadmehod3;

public class ShouHuThread implements Runnable{
    //守护线程
	@Override
	public void run() {
		//得到当前运行线程对象
		Thread th=Thread.currentThread();
		//当前对象名称
		String strname=th.getName();
		while (true) {
			try {
				Thread.sleep(400);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(strname);
		}
	}
	
	
}

测试类:

package com.wangxing.threadmehod3;

public class TestMain {

	public static void main(String[] args) {
		//目标对象
		TestThread testthread=new TestThread();
		ShouHuThread ShouHuThread=new ShouHuThread();
		//线程对象
		Thread th1=new Thread(testthread);
		Thread th2=new Thread(testthread);
		Thread thshouhu=new Thread(ShouHuThread);
		//void  setName(String name)设置线程名称
		th1.setName("用户线程1");
		th2.setName("用户线程2");
		thshouhu.setName("守护线程");
		//设置守护线程
		thshouhu.setDaemon(true);
		// boolean	isDaemon() 测试该线程是否为守护线程。
		System.out.println(th1.getName()+"-isDaemon=="+th1.isDaemon());
		System.out.println(th2.getName()+"-isDaemon=="+th2.isDaemon());
		System.out.println(thshouhu.getName()+"-isDaemon=="+thshouhu.isDaemon());
		//启动线程
		th1.start();
		th2.start();
		thshouhu.start();
		
	}

}

在这里插入图片描述

static voidsleep(long millis) 设置线程休眠【暂停】指定的时间【毫秒】
voidinterrupt() 中断线程休眠【暂停】。
package com.wangxing.test3;
public class MyTestThread implements Runnable{
	@Override
	public void run() {
		String name=Thread.currentThread().getName();
		System.out.println(name+"开始听讲");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(name+"进入梦乡......");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			System.out.println(name+"被老师一脚踹醒");
			System.out.println(name+"又开始听讲");
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			System.out.println("下课啦!");
		}
	}
}

测试类:

package com.wangxing.test3;

public class TestMain {

	public static void main(String[] args) {
		System.out.println("上课铃响啦");
		Thread th=new Thread(new MyTestThread());
		th.setName("小明");
		th.start();
		System.out.println("老师开始上课");
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("老师发现同学睡着啦");
		System.out.println("老师走过去,踹了一脚!");
		th.interrupt();
	}
}

package com.wangxing.test3;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class NaoZhong {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		System.out.println("请设置一个闹钟时间:");
		String setTime=input.nextLine();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		bloolean fag=true;
		while(flag) {
			String newtime=sdf.format(new Date());
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(newtime);
			if(newtime.equals(setTime)) {
				System.out.println("闹钟响铃!!!!!!");
				flag=false;
			}
		}
	}
}

返回值方法
voidjoin(long millis)等待该线程终止的时间最长为 millis 毫秒。【强制线程执行】
package com.wangxing.threadmehod5;
public class TestThread implements Runnable{
	@Override
	public void run() {
		//static Thread	currentThread()得到当前正在运行的线程对象
		Thread  th=Thread.currentThread();
		//String	getName()返回该线程的名称。
		String thname=th.getName();
		for(int i=1;i<=100;i++) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(thname+"--i=="+i);
		}
	}
}

package com.wangxing.threadmehod5;
public class TestMain {
	public static void main(String[] args) {
		Thread th=new Thread(new TestThread());
		th.setName("小明");
		th.start();
		//得到主线程的名称
		String mainname=Thread.currentThread().getName();
		for(int j=1;j<=100;j++){
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(mainname+"--j=="+j);
			if(j==10){
				// void	join(long millis)等待该线程终止的时间最长为 millis 毫秒。【强制线程执行】
				try {
					th.join(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

10.4.线程的生命周期
1、线程的生命周期就是线程从一开始创建,到run方法执行完毕以后的状态变化。[状态之间的切换]
2.线程的生命周期几种状态【1、新建状态 2、就绪状态 3、运行状态 4.阻塞状态 5.死亡状态】
在这里插入图片描述

  • 创建状态:通过new的方式创建出线程对象,此时线程就进入到创建状态【新建状态】。
    新建状态的线程是不能运行。
  • 就绪状态:新建状态的线程调用strat方法之后就会进入就绪状态。
    就绪状态的线程具备执行能力,但是没有cpu资源。【万事具备只差cpu】.
  • 运行状态:就绪状态的线程得到cpu资源开始执行run方法,此时这个线程就是运行状态。
    运行状态的线程当cpu切换到其他线程时候,本线程就再一次进入就绪状态。
  • 阻塞状态:运行状态的线程调用sleep/wait方法…此时线程进入阻塞状态。
    处于阻塞状态的线程的休眠时间到/调用notify方法/notifyAll方法在此时线程进
    入就绪状态,从就绪状态中得到cpu资源从而进入运行状态。
  • 死亡状态:运行状态的线程run方法运行结束/线程执行过程中遇到异常/调用stop方法此时 线程就进入到死亡状态。

死亡状态的线程是不能运行,除非再一次使用strat方法重新启动运行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值