线程常用的方法

原创 2013年12月04日 09:49:58

 

join()——让一个线程等待另一个线程的方法

 

当某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完为止。

join():等待被join的线程执行完成

join(long millis)::等待被join的线程的时间最长为millis毫秒。如果在millis毫秒内被join的线程还没有执行结束,则不再等待。

public class MyRunner3 extends Thread {
	@Override
	public void run() {
		for(int i = 0; i < 5; i++){
			System.out.println("i am " + getName());
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

 

public class TestThread3 {
	public static void main(String[] args) {
		Thread thread = new MyRunner3();
		thread.start();
		try {
			//主线程等待thread的业务处理完了之后再向下运行
			//thread和主线程合并了
			thread.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for(int i = 0; i < 100; i++){
			System.out.println("main : " + i);
		}
	}
}

 

线程睡眠:sleep

 

如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。

当当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间内,该线程不会获得执行机会,即使系统中没有其他可执行线程,处于sleep()中的线程也不会执行,因此sleep()方法常用来暂停程序的执行

public class ThreadSleepDemo {
	public static void main(String[] args) throws InterruptedException {
		for(int i=0; i < 10; i++){
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(1000);
		}
	}
}

 

线程让步:yield

 

yield()方法和sleep()方法有点相似,它也是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入到就绪状态。即让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield()方法暂停之后,线程调度器又将其调度出来重新执行。

实际上,当某个线程调用了yield()方法之后,只有优先级与当前线程相同或者比当前线程更高的处于就绪状态的线程才会获得执行机会。

public class MyRunner4 extends Thread {
	@Override
	public void run() {
		for(int i = 0; i < 100; i++){
			System.out.println(getName() + " : " + i);
			if(i%10 == 0){
				System.out.println("ok");
				yield();
			}
		}
	}
}

 

public class TestThread4 {
	public static void main(String[] args) {
		Thread t1 = new MyRunner4();
		Thread t2 = new MyRunner4();
		t1.start();
		t2.start();
	}
}

 

 sleep()与yield()方法区别:

1、sleep()方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级;但yield()方法只会给优先级高或者相同的线程机会

2、sleep()方法会将线程转入到阻塞状态,知道经过阻塞时间才会转入就绪状态;而yield()不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态。因此完全有可能某个线程调用了yield()方法暂停之后,立即再次获取处理器资源被执行。

3、sleep()方法声明抛出InterruptedException异常,所以嗲用sleep()方法时要么捕捉该异常,要么显示声明抛出该异常;而yield()方法则没有声明抛出任何异常。

4、sleep()方法比yield()方法更好的可移植性,通常不建议使用yield()方法来控制并发线程执行。

 

改变线程的优先级

 

线程的优先级用数字表示,范围从1到10,默认的是为5

优先级设置高了之后,获取CPU运行时间片要多一些,具体执行多少时间由操作系统决定

每个线程默认的优先级与创建它的父线程的优先级相同,在默认情况下,main线程具有普通优先级,由main线程创建的子线程也具有普通优先级

public class MyRunner5 extends Thread {
	@Override
	public void run() {
		for(int i = 0; i < 1000; i++){
			System.out.println(getName() + " : " + i);
		}
	}
}

 

public class TestThread5 {
	public static void main(String[] args) {
		Thread t1 = new MyRunner5();
		Thread t2 = new MyRunner5();
		t2.setPriority(Thread.NORM_PRIORITY+3);
		t1.start();
		t2.start();
	}
}

 

 

多线程基础知识第二篇:线程常用方法及各种状态

本篇主要介绍一下Thread类的方法以及探究一下线程的状态。 首先,Thread类常用的静态方法: 1.Thread.activeCount(),得到存活的线程数,返回值是int类型; 2.Threa...
  • koushr
  • koushr
  • 2015年07月15日 12:03
  • 1114

java线程常用方法详解

1、sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注...
  • nan167567
  • nan167567
  • 2016年08月01日 19:57
  • 4076

Java 线程中的几个重要方法

Java 线程中的几个重要方法start()与run()实现线程类时无论是继承Thread类还是实现Runnable接口,都要实现run()方法实现具体的线程业务逻辑,但是真正启动线程类时要注意使用s...
  • p10614040
  • p10614040
  • 2015年09月22日 22:33
  • 703

Java线程常用的操作方法

目标:  了解设置和取得线程的名称。 了解线程的强制运行。 了解线程的休眠。 了解线程的礼让。 了解线程的中断操作。 具体内容:在多线程中所有的操作方法实际上都是从Thread类开始的。所有的操作都是...
  • u013087513
  • u013087513
  • 2016年06月15日 17:50
  • 1861

创建线程的两种常用方法

1.继承Thread类: (1).定义Thread类的子类,并重写该类的run()方法,run()方法的中写线程需要完成的任务。 (2).创建Thread子类的实例,创建线程对象。 ...
  • hanhan1016
  • hanhan1016
  • 2015年08月19日 14:31
  • 359

线程同步常用方式与区别

在介绍线程同步/互斥之前,我们先要理解同步与互斥的概念,引用书上的解释来说明这2个概念: 1、线程(进程)同步的主要任务 在引入多线程后,由于线程执行的异步性,会给系统造成混乱,特别是在急用临界资...
  • drdairen
  • drdairen
  • 2017年06月20日 14:02
  • 455

线程中的一些基本方法使用

/* * 线程中的方法 * sleep()休眠 毫秒为单位 * yield()让出处理器时间 * join()所有线程等待调用join这个线程结束完了之后再执行 * interru...
  • itlqi
  • itlqi
  • 2015年04月02日 21:38
  • 747

java多线程中常用的线程帮助类

java.util.concurrent 类 Exchanger java.lang.Object java.util.concurrent.Exchanger 类型参数:V - 可以交...
  • qq_32535477
  • qq_32535477
  • 2016年12月22日 16:55
  • 536

线程同步(5种同步方式)

为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),      将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该...
  • cengjingyige
  • cengjingyige
  • 2016年08月31日 10:17
  • 4169

多线程常用方法以及对锁的控制

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp16 1.sleep()     使当前线程(即调用该方法的线程)暂停执行...
  • yemou_blog
  • yemou_blog
  • 2015年12月14日 11:13
  • 1403
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程常用的方法
举报原因:
原因补充:

(最多只允许输入30个字)