1.static Thread currentThread()得到当前正在运行的线程对象
2.void start() 启动线程
3.String getName()返回该线程的名称。
1.当没有设置线程名称的时候,系统会赋予线程一个默认的名称“Thread-0,Thread-1......”
2.主线程【主方法的执行线程】的名称默认是“main”
4.void setName(String name)设置线程名称
- package com.wangxing.test;
- public class MyThread implements Runnable{
- @Override
- public void run() {
- for(int i=1;i<=100;i++){
- //1.static Thread currentThread()得到当前正在运行的线程对象
- Thread dangqianThread=Thread.currentThread();
- //3.String getName()返回该线程的名称。
- String threadname=dangqianThread.getName();
- System.out.println(threadname+"===="+i);
- }
- }
- }
-
- package com.wangxing.test;
- public class TestMain {
- public static void main(String[] args) {
- //得到主线程的名称
- //1.static Thread currentThread()得到当前正在运行的线程对象
- //Thread mainth=Thread.currentThread();
- //String name=mainth.getName();
- //System.out.println("主线程的线程名称=="+name);
-
- //创建目标对象
- MyThread mt=new MyThread();
- //创建线程对象
- //1.通过Thread类的构造方法设置线程名称
- //Thread th1=new Thread(mt,"线程1");
- //Thread th2=new Thread(mt,"线程2");
- Thread th1=new Thread(mt);
- Thread th2=new Thread(mt);
- //2.void setName(String name)设置线程名称
- th1.setName("线程A");
- th2.setName("线程B");
- //启动线程
- //2.void start() 启动线程
- th1.start();
- th2.start();
- }
- }
线程的优先级---就是线程的执行先后。
默认情况下所有线程的优先级都是一样,都是5。
我们可以通过void setPriority(int newPriority) 更改线程的优先级。
1.线程的优先级有10个级别,分别使用整数1~10来表示。数字越大优先级越高。
2.为了方便操作,java将10个级别有规定成3个级别,分别是最低的优先级,中等优先级,最高的优先级,并且将这3个级别封装成了静态常量
static int MAX_PRIORITY 线程可以具有的最高优先级。10
static int MIN_PRIORITY线程可以具有的最低优先级。1
static int NORM_PRIORITY分配给线程的默认优先级。5
int getPriority() 返回线程的优先级。
3.设置线程的优先级的时候,数字越大优先级越高,数字越小优先级越低。优先级越高并不代表就一定会优先执行,只是被优先执行的几率增大,因此不要试图通过控制线程的优先级,来保证某一个线程,总是第一个执行。
- package com.wangxing.test1;
- public class TestMain {
- public static void main(String[] args) {
- MyThread mt=new MyThread();
- Thread th1=new Thread(mt);
- Thread th2=new Thread(mt);
- th1.setName("线程A");
- th2.setName("线程B");
-
- //默认情况下所有线程的优先级都是一样,都是5。
- //void setPriority(int newPriority) 更改线程的优先级。
- //参数int newPriority---就是线程优先级的级别
- //线程的优先级有10个级别,分别使用整数1~10来表示。数字越大优先级越高。
- //th1.setPriority(2);
- //th2.setPriority(8);
- //为了方便操作,java将10个级别有规定成3个级别,
- //最低的优先级----static int MIN_PRIORITY=1
- //中等优先级-----static int NORM_PRIORITY=5
- //最高的优先级----static int MAX_PRIORITY=10
- th1.setPriority(Thread.MIN_PRIORITY);
- th2.setPriority(Thread.MAX_PRIORITY);
- //设置线程的优先级的时候,数字越大优先级越高,数字越小优先级越低。
- //优先级越高并不代表就一定会优先执行,只是被优先执行的几率增大
- //因此不要试图通过控制线程的优先级,来保证某一个线总是第一个执行。
- th1.start();
- th2.start();
- //默认情况下所有线程的优先级都是一样,都是5。
- //int getPriority() 返回线程的优先级。
- int thpri1=th1.getPriority();
- int thpri2=th2.getPriority();
- //得到主线程的优先级
- Thread mainThread=Thread.currentThread();
- int mainpri=mainThread.getPriority();
- System.out.println("线程A的优先级=="+thpri1);
- System.out.println("线程B的优先级=="+thpri2);
- System.out.println("主线程的优先级=="+mainpri);
- }
- }
用户线程----通常情况之下我们所创建的线程都是普通线程,非守护线程,也叫用户线程。
守护线程----也叫精灵线程,当所有用户线程都执行完毕以后,自动结束运行的线程就是守护线程.[共死]
1.boolean isDaemon() 测试该线程是否为守护线程。
2.void setDaemon(boolean on) 将该线程标记为守护线程用户线程。
特征:当所有用户线程都执行完毕以后,无论守护线程能否可以继续运行,都要立刻停止运行。
- package com.wangxing.test2;
- public class MyThread implements Runnable{
- @Override
- public void run() {
- for(int i=1;i<=100;i++){
- //1.static Thread currentThread()得到当前正在运行的线程对象
- Thread dangqianThread=Thread.currentThread();
- //3.String getName()返回该线程的名称。
- String threadname=dangqianThread.getName();
- System.out.println(threadname+"===="+i);
- }
- }
- }
-
- package com.wangxing.test2;
- public class TestThread implements Runnable{
- @Override
- public void run() {
- while(true){
- Thread dangqianThread=Thread.currentThread();
- String threadname=dangqianThread.getName();
- System.out.println(threadname+"====守护线程");
- }
- }
- }
-
- package com.wangxing.test2;
- public class TestMain {
- public static void main(String[] args) {
- MyThread mt=new MyThread();
- Thread th1=new Thread(mt);
- Thread th2=new Thread(mt);
- th1.setName("线程A");
- th2.setName("线程B");
-
- Thread th3=new Thread(new TestThread());
- th3.setName("线程C");
- //2.void setDaemon(boolean on) 将该线程标记为守护线程用户线程。
- th3.setDaemon(true);
-
- //1.boolean isDaemon() 测试该线程是否为守护线程。
- //System.out.println("线程A---isDaemon=="+th1.isDaemon());
- //System.out.println("线程B---isDaemon=="+th2.isDaemon());
- //System.out.println("线程C---isDaemon=="+th3.isDaemon());
- th1.start();
- th2.start();
- th3.start();
- }
- }
static void sleep(long millis) 设置线程休眠【暂停】指定的时间【毫秒】
- 例如:闹钟程序
- package com.wangxing.test3;
-
- import java.text.SimpleDateFormat;
- import java.util.Date;
-
- public class MyThread implements Runnable{
- //保存闹钟时间的变量
- private String naozhongtime="";
- public MyThread(String naozhongtime){
- this.naozhongtime=naozhongtime;
- }
- @Override
- public void run() {
- //设置时间格式
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
- boolean flag=true;
- while(flag){
- //static void sleep(long millis) 设置线程休眠【暂停】指定的时间【毫秒】
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- //得到当前系统时间
- Date date=new Date();
- String time=sdf.format(date);
- System.out.println(time);
- if(time.equals(naozhongtime)){
- System.out.println("闹钟时间到!");
- flag=false;
- }
- }
- }
- }
-
-
- package com.wangxing.test3;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
-
- public class TestMain {
- public static void main(String[] args) throws Exception{
- System.out.println("请输入闹钟时间:");
- BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
- String naozhongtime=input.readLine();
- //创建目标对象
- MyThread myth=new MyThread(naozhongtime);
- //创建线程对象
- Thread th=new Thread(myth);
- //启动线程
- th.start();
- }
- }
void interrupt() 中断线程休眠【暂停】。会进入异常【InterruptedException】。
- package com.wangxing.test4;
-
- import java.text.SimpleDateFormat;
- import java.util.Date;
-
- public class MyThread implements Runnable{
- @Override
- public void run() {
- for(int i=1;i<=100;i++){
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread dangqianThread=Thread.currentThread();
- String threadname=dangqianThread.getName();
- System.out.println(threadname+"===="+i);
- if(i==10){
- System.out.println("休息10秒,接着执行");
- try {
- Thread.sleep(10000);
- } catch (InterruptedException e) {
- System.out.println("休眠时间没有结束,强制被主线程中断");
- }
- }
- }
- }
- }
-
- package com.wangxing.test4;
-
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
-
- public class TestMain {
- public static void main(String[] args) throws Exception{
- //创建目标对象
- MyThread myth=new MyThread();
- //创建线程对象
- Thread th=new Thread(myth);
- th.setName("线程A");
- //启动线程
- th.start();
-
- for(int i=1;i<=100;i++){
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread dangqianThread=Thread.currentThread();
- String threadname=dangqianThread.getName();
- System.out.println(threadname+"===="+i);
- if(i==25){
- //void interrupt() 中断线程休眠【暂停】。会进入异常【InterruptedException】。
- th.interrupt();
- }
- }
- }
- }
void join(long millis)【强制线程执行】等待该线程终止的时间最长为 millis 毫秒。
注意:强制线程执行时,其他的线程不能与之交替运行。
- package com.wangxing.test5;
-
- import java.text.SimpleDateFormat;
- import java.util.Date;
-
- public class MyThread implements Runnable{
- @Override
- public void run() {
- for(int i=1;i<=100;i++){
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread dangqianThread=Thread.currentThread();
- String threadname=dangqianThread.getName();
- System.out.println(threadname+"===="+i);
- }
- }
- }
-
- package com.wangxing.test5;
-
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
-
- public class TestMain {
- public static void main(String[] args) throws Exception{
- //创建目标对象
- MyThread myth=new MyThread();
- //创建线程对象
- Thread th=new Thread(myth);
- th.setName("线程A");
- //启动线程
- th.start();
-
- for(int i=1;i<=100;i++){
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- Thread dangqianThread=Thread.currentThread();
- String threadname=dangqianThread.getName();
- System.out.println(threadname+"===="+i);
- if(i==20){
- //void join(long millis)【强制线程执行】等待该线程终止的时间最长为 millis 毫秒。
- th.join(5000);
- }
- }
- }
- }