文章目录
- 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;
@Override
public 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;
@Override
public 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;
@Override
public 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;
@Override
public 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;
@Override
public 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 block
e.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;
@Override
public 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;
@Override
public 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);
}
}
}
运行结果: