线程中常用的方法(Thread类)
1.void start(): 启动线程,并执行对象的run()方法
2.run(): 线程在被调度时执行的操作
3.String getName(): 返回线程的名称
4.void setName(String name):设置该线程名称
5.static Thread currentThread(): 返回当前线程。在Thread子类中就 是this,通常用于主线程和Runnable实现类
6.static void yield():线程让步
1)暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
2)若队列中没有同优先级的线程,忽略此方法
7.join() :当某个程序执行流中调用其他线程的 join() 方法时,调用线程将 被阻塞,直到 join() 方法加入的 join 线程执行完为止
低优先级的线程也可以获得执行
8.static void sleep(long millis):(指定时间:毫秒)
1)令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后 重排队。
2)抛出InterruptedException异常
9.stop(): 强制线程生命期结束,不推荐使用
设置|获取线程名称:
设置线程的名称一般在启动线程之前设置,也运行在执行过程中设置,允许两个线程有相同的线程名称,但是尽量避免这种情况发生,如果没有给线程起名,则默认线程名类似Thread-0,Thread-1,Thread-2系统会默认给线程编名。
实例:通过构造方法给线程起名
package com.qwy3;
class MyThread extends Thread {
public MyThread() {
// TODO Auto-generated constructor stub
}
public MyThread(String name){
super(name);
}
@Override
public void run() {
for (int i = 0; i <=5; i++) {
//获取当前线程名称
System.out.println(Thread.currentThread().getName());
}
}
}
public class TestThreadName{
public static void main(String[] args) {
MyThread t1= new MyThread("线程-A");
MyThread t2= new MyThread("线程-B");
t1.start();
t2.start();
}
}
运行的可能结果:
线程-B
线程-A
线程-A
线程-A
线程-A
线程-A
线程-A
线程-B
线程-B
线程-B
线程-B
线程-B
实例:通过setName()方法设置线程名称
package com.qwy3;
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i <=5; i++) {
//获取当前线程名称
System.out.println(Thread.currentThread().getName());
}
}
}
public class TestThreadName{
public static void main(String[] args) {
MyThread t1= new MyThread();
MyThread t2= new MyThread();
t1.setName("线程--A");
t2.setName("线程--B");
t1.start();
t2.start();
}
}
运行的可能结果:
线程–A
线程–A
线程–B
线程–B
线程–B
线程–B
线程–B
线程–B
线程–A
线程–A
线程–A
线程–A
线程的礼让
使用yield()方法将一个线程的执行暂时让给其他的线程,释放当前cpu的执行权。
实例:
package com.qwy3;
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i <=5; i++) {
System.out.println(Thread.currentThread().getName()+"--"+i);
if(i==3){
//暂时释放CPU资源
yield();
}
}
}
}
public class TestThreadYield{
public static void main(String[] args) {
MyThread t1= new MyThread();
MyThread t2= new MyThread();
t1.setName("线程--A");
t2.setName("线程--B");
t1.start();
t2.start();
}
}
运行可能的一种结果:
线程–A--0
线程–B--0
线程–B--1
线程–A--1
线程–B--2
线程–A--2
线程–A--3
线程–B--3
线程–A--4
线程–A--5
线程–B--4
线程–B--5
注意:虽然执行了yield()方法,当前执行的线程暂时释放了CPU的资源,但是有可能还没等其他线程获取CPU执行,当前线程随即有获取了CPU的资源。
线程的强制执行
当某个程序执行流中调用其他线程的 join() 方法时,调用线程将被阻塞,直到 join() 方法加入的 join 线程执行完为止。
实例:
package com.qwy4;
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i <= 20; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
}
}
}
public class TestThreadJoin {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start();
for (int i = 0; i <= 20; i++) {
if (i > 5) {
try {
//线程t1强制执行完毕
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "--" + i);
}
}
}
可能一种运行结果:
main–0
main–1
main–2
main–3
main–4
Thread-0–0
Thread-0–1
main–5
Thread-0–2
Thread-0–3
Thread-0–4
Thread-0–5
Thread-0–6
Thread-0–7
Thread-0–8
Thread-0–9
Thread-0–10
Thread-0–11
Thread-0–12
Thread-0–13
Thread-0–14
Thread-0–15
Thread-0–16
Thread-0–17
Thread-0–18
Thread-0–19
Thread-0–20
main–6
main–7
main–8
main–9
main–10
main–11
main–12
main–13
main–14
main–15
main–16
main–17
main–18
main–19
main–20
从多次运行结果看:只要主线运行到main-5后,都会等待线程Thread-0执行完毕之后才会再次执行main线程。
未完待续
=============================================================================================
如有不妥之处,欢迎大家给予批评指出,如果对您有帮助,给留下个小赞赞哦
==============================================================================================