文章目录
- 1. 基本方法
- 2. 线程的优先级
- 3. 进阶方法
- 3.1. 举例
- 3.1.1. 线程让步
- 3.1.2. join() 方法
- 3.1.3. sleep()方法
- 3.1.4. stop() 方法
- 3.1.4. isAlive() 方法
1. 基本方法
方法名 | 作用 |
---|---|
void start() | 启动线程,并执行对象的 run() 方法 |
run() | 线程在被调度时执行的操作 |
String getName() | 返回线程的名称 |
void setName(String name) | 设置该线程名称 |
static currentThread() | 返回当前线程 |
举例:
package day15;public class Test1 {public static void main(String[] args) {TestRun run0 = new TestRun();TestRun run1 = new TestRun();Thread t0 = new Thread(run0);Thread t1 = new Thread(run1);t0.start();t1.start();t0.setName("线程t0");//设置线程的名称System.out.println(t0.getName());//如果在创建线程的时候没有指定名称,系统会给出默认名称,通过getNmae()获取线程名称System.out.println(t1.getName());System.out.println("-----------------------1");System.out.println("-----------------------2");System.out.println("-----------------------3");}
}class TestRun implements Runnable{int count = 0;@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");for(int i = 0; i <5; i++) {count++;System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);}}
}
运行结果:
2. 线程的优先级
线程的优先级控制:
优先级从1-10的整数共10个等级概率。
1 代表最低优先级;10 代表最高优先级;5 代表普通优先级。
涉及的方法:
getPriority()
:返回线程优先值
setPriority(int newPriority)
:改变线程的优先级
线程创建时继承父线程的优先级
举例:
package day15;public class Test1 {public static void main(String[] args) {TestRun run0 = new TestRun();TestRun run1 = new TestRun();Thread t0 = new Thread(run0);Thread t1 = new Thread(run1);t0.setName("线程t-0");//设置线程的名称t1.setName("线程t-1");t0.setPriority(1);//设置线程优先级t1.setPriority(10);t0.start();t1.start();// System.out.println(t0.getName());//如果在创建线程的时候没有指定名称,系统会给出默认名称,通过getNmae()获取线程名称
// System.out.println(t1.getName());/*** 线程的优先级,就是那个线程有较大的概率被执行* 优先级是用数字1-10表示,数字越大优先级越高,如果没有设置优先级则默认是5*/System.out.println("t-0的优先级:" + t0.getPriority());//获取线程的优先级System.out.println("t-1的优先级:" + t1.getPriority());//获取线程的优先级System.out.println("-----------------------1");System.out.println("-----------------------2");System.out.println("-----------------------3"); }
}class TestRun implements Runnable{int count = 0;@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");for(int i = 0; i <5; i++) {count++;System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);}}
}
运行结果(其中一种结果):
这里需要注意:
虽然设置了t1的优先级高于t0,但是优先级只是概率问题,概率高的不一定就先执行(只是先执行的可能更大)
3. 进阶方法
①static void yield()
:线程让步
暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
若队列中没有同优先级的线程,忽略此方法
②join()
:当某个程序执行流中调用其他线程的 join() 方法时,调用线程将被阻塞,直到 join() 方法加入的 join 线程执行完为止
低优先级的线程也可以获得执行
③static void sleep(long millis)
: ( 指定时间 : 毫秒 )
令当前活动线程在指定时间段内放弃对 CPU 控制 , 使其他线程有机会被执行 , 时间到后重排队。
抛出 InterruptedException 异常
④stop()
:强制线程生命期结束
⑥boolean isAlive()
:返回 boolean ,判断线程是否还活着
3.1. 举例
3.1.1. 线程让步
package day15;public class Test1 {public static void main(String[] args) {TestRun run0 = new TestRun();TestRun run1 = new TestRun();Thread t0 = new Thread(run0);Thread t1 = new Thread(run1);t0.setName("线程t-0");//设置线程的名称t1.setName("线程t-1");//设置线程的名称t0.start();t1.start(); System.out.println("-----------------------1");System.out.println("-----------------------2");System.out.println("-----------------------3");}
}class TestRun implements Runnable{int count = 0;@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");for(int i = 0; i <5; i++) {if(i % 2 ==0) {Thread.yield();//线程让步}count++;System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);}}
}
运行结果:
注意:
线程让步可能在结果展现上并不明显,但实际上确实让步了。
3.1.2. join() 方法
package day15;public class Test1 {public static void main(String[] args) {TestRun run0 = new TestRun();TestRun run1 = new TestRun();Thread t0 = new Thread(run0);Thread t1 = new Thread(run1);t0.setName("线程t-0");//设置线程的名称t1.setName("线程t-1");//设置线程的名称 t0.start();t1.start(); System.out.println("-----------------------1");System.out.println("-----------------------2");//join()方法try {t0.join();//相当于在这块把t0的run的代码插入到这个位置执行/*** 专业的说法:* 就是阻塞当前的main方法,先不执行System.out.println("-----------------------3")代码* 先执行join进来的线程的代码* join的线程执行完毕之后继续执行之前main方法阻塞的代码System.out.println("-----------------------3")*/} catch (InterruptedException e) {e.printStackTrace();}System.out.println("-----------------------3");}
}class TestRun implements Runnable{int count = 0;@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");for(int i = 0; i <5; i++) {count++;System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);}}
}
运行结果:
上面代码无论执行多少次,线程t-0的运行结果始终在“--------------2”和“----------------3”之间。
3.1.3. sleep()方法
package day15;public class Test1 {public static void main(String[] args) {TestRun run0 = new TestRun();TestRun run1 = new TestRun();Thread t0 = new Thread(run0);Thread t1 = new Thread(run1);t0.setName("线程t-0");//设置线程的名称t1.setName("线程t-1");//设置线程的名称t0.start();t1.start(); System.out.println("-----------------------1");System.out.println("-----------------------2"); System.out.println("-----------------------3");}
}class TestRun implements Runnable{int count = 0;@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");for(int i = 0; i <5; i++) {try {Thread.sleep(1000);//当前线程睡眠1000毫秒//相当于当前的这个循环每隔1000毫秒执行一次循环} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}count++;System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);}}
}
运行结果:
每隔1s逐步输出
3.1.4. stop() 方法
package day15;public class Test1 {public static void main(String[] args) {TestRun run0 = new TestRun();TestRun run1 = new TestRun();Thread t0 = new Thread(run0);Thread t1 = new Thread(run1);t0.setName("线程t-0");//设置线程的名称t1.setName("线程t-1");//设置线程的名称t0.start();t1.start(); System.out.println("-----------------------1");System.out.println("-----------------------2");System.out.println("-----------------------3");t1.stop();//强制线程生命期结束,强制停止此线程}
}class TestRun implements Runnable{int count = 0;@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");for(int i = 0; i <5; i++) {count++;System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);}}
}
运行结果:
可以看出t-1线程刚执行就结束了
3.1.4. isAlive() 方法
package day15;public class Test1 {public static void main(String[] args) {TestRun run0 = new TestRun();TestRun run1 = new TestRun();Thread t0 = new Thread(run0);Thread t1 = new Thread(run1);t0.setName("线程t-0");//设置线程的名称t1.setName("线程t-1");//设置线程的名称t0.start();t1.start(); System.out.println("-----------------------1");System.out.println("-----------------------2");System.out.println("-----------------------3");System.out.println(t1.isAlive());//判断当前线程是否存活t1.stop();//强制线程生命期结束,强制停止此线程System.out.println(t1.isAlive());//判断当前线程是否存活}
}class TestRun implements Runnable{int count = 0;@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");for(int i = 0; i <5; i++) {count++;System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);}}
}
运行结果: