多线程2

10.2.多线程的创建方式以及区别
Java中的线程
当一个java程序启动运行以后,至少有2个线程在运行。
1.主线程,就是java程序的主方法执行线索
2.垃圾回收线程。
Java中多线程的创建方式
第一种,通过继承Thread类创建线程类
第二种,通过实现Runnable接口创建线程类
第三种,通过Callable和Future接口创建线程
【第4种,通过线程池技术创建线程】
上面3种多线程的创建方式区别
在这里插入图片描述
通常情况我们都是使用实现Runnable接口方式创建线程。
10.3.线程中的常用操作方法
Java.lang.Thread类【线程类】
在这里插入图片描述
线程的优先级–就是线程的执行先后。
1.线程的优先级有10个级别,分别使用整数1~10来表示。
为了方便操作,java将10个级别有规定成3个级别,分别是最低的优先级,中等优先级,最高的优先级,并且将这3个级别封装成了静态常量
在这里插入图片描述
2.设置线程的优先级的时候,数字越大优先级越高,数字越小优先级越高。优先级越高并代表就一定会优先执行,只是被优先执行的几率增大,因此不要试图通过控制线程的优先级,来保证某一个线程,总是第一个执行。
3.所有线程默认的优先级都是5【中等级别】

package com.lx.test1;

public class MyTestThread implements Runnable {
	@Override
	public void run() {
		static Thread	currentThread()得到当前正在运行的线程对象
		Thread threadObj = Thread.currentThread();
		//String getName()返回该线程的名称
		String threadName = threadObj.getName();
		for(int i = 1;i<=20;i++) {
			System.out.println(threadName+"--i"+i);
		}
	}

}

package com.lx.test1;

public class TestMain {

	public static void main(String[] args) {
	/*
		//得到主线程的线程名称
		Thread mainThread = Thread.currentThread();
		String mainName = mainThread.getName();
		//int getPriority()返回线程的优先级
		int mainpro = mainThread.getPriority();
		System.out.println("主线程的名称=="+mainName);
		System.out.println("主线程的优先级=="+mainpro);
	
	*/
		//创建目标对象
		MyTestThread mtth = new MyTestThread();
		//创建线程对象
		Thread th1=new Thread(mtth);
		//void setName(String name)设置线程名称
		th1.setName("线程A");
		//void	setPriority(int newPriority) 更改线程的优先级。
		th1.setPriority(1);
		// int	getPriority() 返回线程的优先级。
		int th_a_pro=th1.getPriority();
		System.out.println("线程A的优先级=="+th_a_pro);
		//void start() 启动线程
		th1.start();
		//创建线程对象
		Thread th2 = new Thread(mtth);
		//void setName(String name)设置线程名称
		th2.setName("线程B");
		//void	setPriority(int newPriority) 更改线程的优先级。
		th2.setPriority(Thread.MAX_PRIORITY);
		// int getPriority() 返回线程的优先级。
		int th_b_pro = th2.getPriority();
		System.out.println("线程B的优先级=="+th_b_pro);
		//void start() 启动线程
		th2.start();
	}	
}

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

package com.lx.test2;

public class TestThread implements Runnable{
	@Override
	public void run() {
		//static Thread	currentThread()得到当前正在运行的线程对象
		Thread threadObj=Thread.currentThread();
		//String	getName()返回该线程的名称。
		String threadName=threadObj.getName();
		for(int i=1;i<=20;i++) {
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(threadName+"--i=="+i);
		}
	}
}

package com.lx.test2;

public class DoxThread  implements Runnable {
	@Override
	public void run() {
		//static Thread	currentThread()得到当前正在运行的线程对象
		Thread threadObj=Thread.currentThread();
		//String	getName()返回该线程的名称。
		String threadName=threadObj.getName();
		while(true) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(threadName+"是一个守护线程");
				}
	}

}

package com.lx.test2;

public class TestMain {

	public static void main(String[] args) {
		//创建目标对象
				TestThread tth=new TestThread();
				DoxThread dth=new DoxThread();
				//创建线程对象
				Thread th1=new Thread(tth);
				Thread th2=new Thread(tth);
				Thread th3=new Thread(dth);
				//void setDaemon(boolean on) 将该线程标记为守护线程用户线程。
				th3.setDaemon(true);
				//boolean isDaemon() 测试该线程是否为守护线程。
				System.out.println("th1是否是守护线程?"+th1.isDaemon());
				System.out.println("th2是否是守护线程?"+th2.isDaemon());
				System.out.println("th3是否是守护线程?"+th3.isDaemon());
				//设置线程的名称
				th1.setName("线程A");
				th2.setName("线程B");
				th3.setName("C线程");
				//启动线程
				th1.start();
				th2.start();
				th3.start();
	
	}	
}

在这里插入图片描述

在这里插入图片描述

package com.lx.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+"进入TiMi......");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			System.out.println(name+"关闭vx");
			System.out.println(name+"从新打开TiMi");
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			System.out.println("玩个der,菜鸡,不玩了");
		}
	}

}

package com.lx.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("打开vx找找小姐姐❤");
		System.out.println("一个都没得,啥也不是,匹配小姐姐☺!");
		th.interrupt();
	}	
}

在这里插入图片描述

package com.lx.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");
		boolean flag=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;
			}
		}
	}
}

在这里插入图片描述
在这里插入图片描述

package com.lx.test4;

public class MyTestThread  implements Runnable {
	@Override
	public void run() {
		String name=Thread.currentThread().getName();
		for(int i=1;i<=20;i++) {
			try {
				Thread.sleep(300);
			}catch(InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(name+"--i=="+i);
		}
	}

}

package com.lx.test4;

public class TestMain {

	public static void main(String[] args) {
		Thread th=new Thread(new MyTestThread());
		th.setName("Test线程");
		th.start();
		String mainname=Thread.currentThread().getName();
		for(int j=1;j<20;j++) {
			try {
				Thread.sleep(200);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(mainname+"--j"+j);
			if(j==10) {
				try {
					th.join(1000);
				}catch(InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}	
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值