44--多线程(三)

线程中常用的方法(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线程。

未完待续
=============================================================================================
如有不妥之处,欢迎大家给予批评指出,如果对您有帮助,给留下个小赞赞哦
==============================================================================================

猜你喜欢

转载自blog.csdn.net/qwy715229258163/article/details/114856298