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.死亡状态】