1.后台线程
/**
*
* @author emmet1988.iteye.com
*
* 后台线程的任务是为其他线程提供服务,JVM的垃圾回收线程是典型的后台线程。
* 调用Thread对象的setDaemon方法可将指定线程设置成后台线程,当所有的前台线程
* 死亡时,后台线程也将随之死亡,虚拟机也将自动退出。
*
* 注意点:
* 1.主线程默认是前台线程
* 2.前台线程创建的子线程默认是前台线程,后台线程创建的子线程默认是后台线程
* 3.将某个线程设置为后台线程必须在该线程start之前
* 4.可以使用isDaemon方法来判断指定线程是否是后台线程
*
*/
public class DaemonThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("后台线程:"+getName()+" "+i);
}
}
public static void main(String[] args) {
DaemonThread daemonThread = new DaemonThread();
daemonThread.setDaemon(true);
daemonThread.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
// 程序执行到此处,前台线程(main线程)结束,后台线程也将随之结束
}
}
2.FirstThread.java
/**
*
* @author emmet1988.iteye.com
*
* 注意查看变量i在两个新线程中的值,我们可以知道,使用继承Thread
* 类的方法来创建线程类,多条线程之间无法共享线程类的实例变量。
*
* 这里有几点需要注意一下:
* 1.当主线程结束的时候,其他线程不受任何影响,并不会随之结束。
* 2.测试线程的死亡状态可以用isAlive方法来判断,新建和死亡状态的
* 线程返回false,就绪,运行和阻塞的线程返回true。
* 3.不可以对已经死亡的线程再次调用start方法,start方法只能对新建状态
* 的线程调用,对新建状态下的线程两次调用start方法也是错误的,都会抛出
* IllegalThreadStateException异常。
*
*/
public class FirstThread extends Thread {
private int i;
@Override
public void run() {
// super.run();
for (; i < 10; i++) {
System.out.println("子线程: "+getName()+"| i = "+i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
System.out.println("主线程: "+Thread.currentThread().getName()+"| 局部:i = "+i);
if(i == 2){
System.out.println("启动2个新线程");
new FirstThread().start();
new FirstThread().start();
}
}
}
}
3.SecondThread.java
/**
*
* @author emmet1988.iteye.com
*
* 采用实现Runnable接口的形式创建的多条线程可以共享线程类的实例属性
* 这一点要和通过继承Thread创建的线程区别开来。这是因为使用Runnable
* 接口创建的线程,Runnable对象只是作为线程的一个target,而多条线程可
* 以共享同一个target,所以多条线程可以共享同一个target类的实例属性。
*
*/
public class SecondThread implements Runnable {
private int i;
@Override
public void run() {
for (; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" |成员: i = "+i);
}
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" | 局部:i = "+i);
if (i == 2) {
SecondThread secondThread = new SecondThread();
new Thread(secondThread,"新线程1").start();
new Thread(secondThread,"新线程2").start();
}
}
}
}
4.线程休眠sleep
import java.util.Date;
/**
*
* @author emmet1988.iteye.com
*
* 让线程休眠一段时间,并进入阻塞状态。
*/
public class SleepThread extends Thread {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 5; i++) {
System.out.println("当前时间:"+new Date());
sleep(1000);
}
}
}
5.让出当前线程yield
/**
*
* @author emmet1988.iteye.com
*
* yield的方法是让当前正在执行的线程暂停,但是它不会阻塞该线程,它只是将该
* 线程转入就绪状态,yield只是让当前线程暂停一下,让系统的线程调度器重新调度
* 一次,完全可能的情况是:当某个线程调用了yield方法暂停之后,线程再次被调度出来
* 重新执行,因为当某个正在执行的线程调用了yield方法暂停之后,只有优先级比当前线程的优先级
* 更高的线程或者与当前线程优先级相同的线程才会获得执行机会。
*
* 关于优先级在这里说明一下:
* 1.每个线程默认的优先级都与创建该线程的父线程具有相同的优先级
* 2.main方法具有普通优先级,优先级的值为5
* 3.可以通过setPriority(int newPriority)和getPriority()来设置和得到线程的优先级(newPriority的值在1-10之间)
* 系统有三个优先级常量:MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY,分别是10,1,5
*/
public class YieldThread extends Thread {
public YieldThread(){
// YieldThread.setDefaultUncaughtExceptionHandler(getDefaultUncaughtExceptionHandler());
YieldThread.setDefaultUncaughtExceptionHandler(ueh);
}
Thread.UncaughtExceptionHandler ueh = new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
// 处理该线程类所有实例可能抛出的未被捕获的异常
}
};
public YieldThread(String name){
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(""+Thread.currentThread().getName()+" "+i);
if (i == 2) {
// 当i等于2时,使用yield方法来让当前线程让步(让该线程重新进入就绪状态)
Thread.yield();
}
}
}
public static void main(String[] args) {
// 启动两条并发线程
YieldThread yt1 = new YieldThread("优先级高");
yt1.setPriority(MAX_PRIORITY);
yt1.start();
YieldThread yt2 = new YieldThread("优先级低");
yt2.setPriority(MIN_PRIORITY);
yt2.start();
}
}
6.让一个线程等待另一个线程的完成 join
/**
*
* @author emmet1988.iteye.com
*
* Thread提供了让一个线程等待另一个线程执行完成的方法:join方法。
* 当某个线程的执行流中调用了其他线程的join方法时,则调用线程将
* 被阻塞,直到被join方法加入的join线程完成为止。
*
* join方法有三种重载的形式:
* 1.join(); 等待被join的线程执行完成。
* 2.join(long millis); 等待被join的线程的时间最长为millis毫秒。
* 2.join(long millis,int nanos); 等待被join的线程的最长时间为millis毫秒 加上nanos毫秒(千分之一毫秒)。
*/
public class JoinThread extends Thread {
public JoinThread(String name){
super(name);
}
@Override
public void run() {
// super.run();
for (int i = 0; i < 10; i++) {
System.out.println("子线程:"+getName()+" "+i);
}
}
public static void main(String[] args) throws InterruptedException {
new JoinThread("新线程").start();
for (int i = 0; i < 10; i++) {
if (i==2 ) {
JoinThread jt = new JoinThread("被Join的线程");
jt.start();
// 在main线程的执行流中(即本方法)调用了jt线程的Join方法,
// 则main线程必须执行结束才会向下继续执行。
jt.join();
}
System.out.println("主线程:"+Thread.currentThread().getName()+" "+i);
}
}
}
分享到:
相关推荐
主要介绍了java 多线程Thread与runnable的区别的相关资料,java线程有两种方法继承thread类与实现runnable接口,下面就提供实例帮助大家理解,需要的朋友可以参考下
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
JAVA 的线程详解,有实例的!使用后别忘给个评价>>>>
学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两个不同的时间间隔( 1 秒和 3 秒)在屏幕上显示当前时间。 3.写一个程序,模拟4个售票窗口共同卖100张火车票的程序。 使用继承Thread类方式和实现...
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
分别用Thread类和Runnable接口实现的阶乘的计算过程及结果的显示(本来一开始设置的不要积分,不知道为啥变得需要积分了,故此调整一下)
1、Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。 2、多线程是并发执行的,交替占有cpu执行,请编写示例程序,并观察输出结果。 3、采用线程同步方法...
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。 要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。可通过这种方法实现多个线程的...
java中实现多线程有两种方法:一种是继承Thread类,另一种是实现Runnable接口。
主要介绍了Java 线程(Thread,Runnable,Callable)实例详解的相关资料,这里对java 线程的三种方法进行了对比,需要的朋友可以参考下
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
本文首先介绍了线程的有关概念,接着介绍了线程的生命期及其状态间的转换,多线程的调度 原则,线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口
java application multiThread clock,模拟时钟(AWT程序、Runnable接口),有时、分、秒针 编写一个应用程序,创建三个线程分别显示各自的时间。
Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口...
在Java中只支持单继承,因此通过继承Thread类创建线程有一定的局限性,这时可以使用另一种方式,即实现Runnable接口来创建线程。通过这种方式需要在Thread(Runnable target)的构造方法中,传递一个实现了Runnable...
继承Thread类构造线程 实现Runnable接口构造线程
主要介绍了Java中Thread 和Runnable的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java多线程机制 runnable thread
多线程的学习的笔记 Thread1:继承Thread类 * Thread2:继承Runnable接口 * * ThreadMethod:一些Thread常见方法 * ThreadTestDome1 练习:创建两个线程 其中一个线程遍历100以内的偶数 另一个遍历一百内奇数 ...