`

Java学习 之 线程(Thread,Runnable)

阅读更多

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接口。 1. 继承Thread类创建线程: 当你选择继承Thread类时,你需要创建一个新的类,这个类扩展自Thread类。Thread类已经实现了Runnable接口,所以你不...

    java 多线程Thread与runnable的区别

    Java 多线程 Thread 与 Runnable 的区别 Java 多线程技术是 Java 语言中的一种基础技术,用于实现多任务并发执行的功能。在 Java 中,实现多线程有两种方法:继承 Thread 类和实现 Runnable 接口。在本文中,我们将...

    java多线程Runnable实例

    `Runnable`接口是Java实现多线程的一种方式,通过实现`Runnable`接口并创建`Thread`对象,可以轻松地创建并运行多线程。`TestRunnable.java`文件展示了这一过程,同时也提醒我们在实际开发中要注意线程同步和通信,...

    JAVA中使用Thread类和Runnable接口创建多线程

    在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。

    thread 线程类 实现runnable接口

    Thread 线程类是 Java 中 Thread 和 Runnable 接口的实现,它提供了线程的基本操作和管理。下面是对 Thread 类的详细介绍: 1. Runnable 接口 Runnable 接口是 Thread 类的基类,它提供了 run() 方法,该方法是...

    【java学习记录】11.多线程实现阶乘计算(Thread类和Runnable接口)

    总结来说,Java中的`Thread`类和`Runnable`接口提供了两种创建多线程的方式,它们都可用于实现阶乘计算。理解这些基础概念是进行并发编程的关键,也是提升程序效率的重要手段。在实际应用中,应根据项目需求和最佳...

    多线程的Runnable_和thread有什么区别

    ### 多线程的Runnable与Thread的区别 在Java中实现多线程有两种主要方式:一种是继承`Thread`类;另一种是实现`Runnable`接口。本文将深入探讨这两种方法的区别,帮助初学者更好地理解并选择适合场景的多线程实现...

    Java 模拟线程并发

    在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable接口以及使用ExecutorService和Future等高级API。下面将详细探讨这些知识点。 首先,Java中创建线程主要有两种方法。一种是通过继承Thread...

    Java中Runnable和Thread的区别

    在Java编程语言中,多线程的实现有多种方式,其中最常见的是通过继承`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景,理解它们之间的区别对于编写高效、可维护的多线程应用至关重要。 ### 继承...

    Java多线程技术 线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口

    继承`Thread`类的方法简洁明了,但在Java中不建议过度使用继承,尤其是为了实现多线程的目的。相比之下,实现`Runnable`接口的方式更加灵活,适用于大多数情况,特别是当一个类已经继承了另一个类的情况下。 #### ...

    JAVA多线程Thread和Runnable的实现

    在Java编程语言中,创建和管理多线程是并发编程的核心技能之一。有两种主要的方式可以实现多线程:继承`Thread`类和实现`Runnable`接口。这两种方法各有特点,适用于不同的场景。 **继承Thread类** 当一个类直接...

    java多线程、通信机制、Thread类以及Runnable接口间的使用实例

    学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两个不同的时间间隔( 1 秒和 3 秒)在屏幕上显示当前时间。 3.写一个程序,模拟4个售票窗口共同卖100张火车票的程序。 使用继承Thread类方式和实现...

    Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。

    在Java中,实现多线程的两种主要方式分别是:**通过继承`Thread`类** 和 **实现`Runnable`接口**。下面将详细介绍这两种方式,并提供相应的示例程序。 #### 一、通过继承`Thread`类实现多线程 在Java中,可以通过...

    在Java中创建线程有两种方法

    Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当你选择继承`Thread`类时,你需要创建一个新的类,该类直接...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    java多线程学习

    在学习Java多线程的过程中,理解线程与进程的概念是非常基础且重要的一步。首先,进程是一个程序的执行实例,是操作系统资源分配的基本单位,具有独立的地址空间和运行状态。每个进程至少包含一个线程,我们称之为...

    Java多线程机制(讲述java里面与多线程有关的函数)

    另一种创建线程的方法是实现Runnable接口,创建一个实现了Runnable接口的类,然后在Thread构造函数中传入该类的实例。线程启动后,会调用Runnable接口的run()方法。 9.4 线程的常用方法: - `start()`: 使线程从...

    Java线程状态流转图

    RUNNABLE状态是Java线程的核心状态。在这个状态下,线程已经准备好执行,但尚未获得CPU时间片。只有当线程获得CPU时间片后,才能真正执行run()方法中的代码。当线程执行完毕run()方法中的代码后,将转换到TERMINATED...

    javad多线程

    "多线程编程详解" Java 多线程编程是指在一个程序中可以运行多个线程,以提高程序的执行效率和响应速度。...Java 中的多线程编程可以通过 Thread 类和 Runnable 接口来实现,需要解决线程同步和线程阻塞问题。

    java多线程Demo

    Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...

Global site tag (gtag.js) - Google Analytics