Java中Thread类中的常用方法-yield sleep join介绍

        在网上也找了很多的资料进行学习,学习资料参差不齐,自己也在学习过程中总结了一些自己的内容,愿意记录自己的历程,同时分享出来,求指教。

一、在java中定义线程有两种方法。

    (1)继承类Thread、

    (2)使用接口Runnable

下面的例子来进行说明。

定义主方法ThreadDemo01

package com.linlin.thread;
/**
 * 可以继承Thread类
 * 或者使用接口runnable
 * 
 * 此处将实现和调用分散在不同的java文件中
 * @author 
 *
 *状态包括:创建,就绪,执行,阻塞,终止
 */
public class ThreadDemo01 {
	public static void main(String[] args) {
//              调用Thread类进行线程的实现    
		MyThread t1 = new MyThread("A");
		MyThread t2 = new MyThread("B");
		t1.run();
		t2.run();
		/**
		 * 线程的启动时是使用start() 方法。
		 */
		t1.start();
		t2.start();
	}

}


配合继承自Thread类的类MyThread进行线程实例的实现

package com.linlin.thread;
/**
 * 使用thread类进行线程的创建
 * @author 
 *
 */
public class MyThread extends Thread {
	private String name;
		
	public MyThread(String name) {
		this.name = name;
	}
		
	@Override
	public void run() {
		super.run();
		for (int j = 0; j < 100; j++) {
			System.out.println(name +":" +j);
		}
	}
}


下面使用Runnable接口进行线程的实例实现的展示

package com.linlin.thread;
/**
 * 可以继承Thread类
 * 或者使用接口runnable
 * 
 * 此处将实现和调用分散在不同的java文件中
 * @author 
 *
 *状态包括:创建,就绪,执行,阻塞,终止
 */
public class ThreadDemo01 {
	public static void main(String[] args) {
//              此处使用Runnable接口进行线程的实现
		MyRunnable r1 = new MyRunnable("A");
		MyRunnable r2 = new MyRunnable("B");
		/**
		 * 继承了Runnable接口的MyRunnable并没有启动线程的方法,所以还是需要使用Thread方法,并将r1,和r2作为参数传入
		 */
		Thread t1 = new Thread(r1);
		Thread t2 = new Thread(r2);
		t1.start();
		t2.start();
	}

}


使用了Runnable接口的MyRunnable类信息如下:

package com.linlin.thread;

public class MyRunnable implements Runnable{
	private String name;
	
	public MyRunnable(String name) {
		this.name = name;
	}
	
	@Override
	public void run() {
		for (int i = 0; i < 1000; i++) {
			System.out.println(name+":"+i);
		}
	}
}

二、在线程创建后使用getName() 方法获取当前线程的名字

package com.linlin.thread;

class Runnable1 implements Runnable{
	private String name;
	
	public Runnable1(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {			
			System.out.println(name+"当前的线程是:"+Thread.currentThread());
			System.out.println("当前的线程名字是:"+Thread.currentThread().getName());
		}
	}
}
public class ThreadDemoGetName{
	public static void main(String[] args) {
		Runnable1 r1 = new Runnable1("A");
		Thread t1 = new Thread(r1);
		t1.start();
	}
}

结果如下图:


三、使用join方法使一个线程强制执行,抢断cpu资源

package com.linlin.thread;

class RunnableDemo03 implements Runnable{
	private String name;

	public RunnableDemo03(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
				System.out.println(name+":"+i);
		}
	}
}

public class ThreadDemoSleep {
	public static void main(String[] args) {
		RunnableDemo03 rd = new RunnableDemo03("A");
		Thread t1 = new Thread(rd);
		/**判断线程是否在执行,输出执行状态*/
		System.out.println(t1.isAlive());
		t1.start();
		//t1.join()方法的使用。帮助我们进行强制执行我们的线程
		for (int i = 0; i < 50; i++) {
			if(i>10) {
				try {
					t1.join();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("主线程"+i);
		}
		System.out.println(t1.isAlive());

	}
}

结果如图:


四、使用isAlive() 判断线程是否处于执行状态

package com.linlin.thread;

class RunnableDemo03 implements Runnable{
	private String name;

	public RunnableDemo03(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		
	}
}

public class ThreadDemoSleep {
	public static void main(String[] args) {
		RunnableDemo03 rd = new RunnableDemo03("A");
		Thread t1 = new Thread(rd);
		/**判断线程是否在执行,输出执行状态*/
		System.out.println("线程是否在执行?---"+t1.isAlive());
		t1.start();
		System.out.println("线程是否在执行?---"+t1.isAlive());

	}
}

判断线程是否处于执行状态的结果如下:


五、使用sleep使线程休眠,Thread.sleep(1000);表示睡眠时间为1秒钟

package com.linlin.thread;

class RunnableDemo03 implements Runnable{
	private String name;

	public RunnableDemo03(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			try {
				//让线程睡眠,然后我们就让线程一秒钟执行一次
				Thread.sleep(1000);
				System.out.println(name+":"+i);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

public class ThreadDemoSleep {
	public static void main(String[] args) {
		RunnableDemo03 rd = new RunnableDemo03("A");
		Thread t1 = new Thread(rd);
		t1.start();
	}
}

使java程序中线程睡眠的程序测试结果如图:(数值间隔时间为1秒 -依次打印)


六、yield的方法,是使得我们得数值到达一个值之后,让出当前我们占领的cpu资源,之后由剩下的所有的线程进行资源的抢夺,首先获得资源的进行下一次的线程的执行与输出。

package com.linlin.thread;
class RunnableDemo04 implements Runnable{
	
	private String name;
	public RunnableDemo04(String name) {
		this.name = name;
	}
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
				System.out.println(name+":"+i);
			if (i == 10) {
				System.out.println("礼让");
				Thread.yield();			
			}
		}
	}
	
}
public class ThreadDemoYield {
	public static void main(String[] args) {
		RunnableDemo04 r1 = new RunnableDemo04("A");
		RunnableDemo04 r2 = new RunnableDemo04("B");
		Thread t1 = new Thread(r1);
		Thread t2 = new Thread(r2);
		t1.start();
		t2.start();
	}
}

第一次的结果截图:


第二次结果参考:


,在学习中自我感觉最重要的就是勤加练习,孰能生巧,单靠死记硬背是没有任何效果的,我们学习不只是为了一个饭碗,更重要的是可以实现从0到1的进步。

一起加油!祝你们学习顺利。

猜你喜欢

转载自blog.csdn.net/qq_32670879/article/details/79888425
今日推荐