`

初探多线程之线程

    博客分类:
  • java
阅读更多

Thread类和Runnable接口,Callable接口的区别:

/**
 * 继承thread类来生成线程 线程不共享资源
 * 
 * @author Administrator
 * 
 */
public class HelloThread extends Thread {
	private int count = 5;

	public void run() {
		for (int i = 0; i < 5; i++) {
			if (count > 0) {
				System.out.println("count= " + count--);
			}
		}
	}

	public static void main(String[] args) {
		HelloThread thread1 = new HelloThread();
		HelloThread thread2 = new HelloThread();
		HelloThread thread3 = new HelloThread();
		thread1.start();
		thread2.start();
		thread3.start();
	}
}

 运行结果:

count= 5
count= 4
count= 3
count= 2
count= 1
count= 5
count= 4
count= 3
count= 2
count= 1
count= 5
count= 4
count= 3
count= 2
count= 1

 

/**
 * 实现runnable接口生成线程对象
 * 对象共享资源
 * runnable是代理目标对象
 * @author Administrator
 *
 */
public class HelloRunnable implements Runnable{
	private int count = 5;
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			if (count > 0) {
				System.out.println("count= " + count--);
			}
		}

	}
	
	public static void main(String[] args) {
		HelloRunnable helloRunnable = new HelloRunnable();
		new Thread(helloRunnable).start();
		new Thread(helloRunnable).start();
		new Thread(helloRunnable).start();
	}
}

 运行结果:

count= 5
count= 3
count= 4
count= 1
count= 2

 

/**
 * jdk1.5后新加的函数
 * @author Administrator
 *
 */
public class CallableTest implements Callable<Integer>{

	@Override
	public Integer call() throws Exception {
		int i = 0;
		for(; i < 10; i++){
			System.out.println(Thread.currentThread().getName() + " " + i);
		}
		return i;
	}
	
	public static void main(String[] args) {
		CallableTest callableTest = new CallableTest();
		FutureTask<Integer> futureTask = new FutureTask<Integer>(callableTest);
		new Thread(futureTask).start();
	}
}

 运行结果:

Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9

 

总结:

实现Runnable接口和Callable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

 

判断线程是否启动:

/**
 * 判断线程是否启动
 * @author Administrator
 *
 */
public class StartThreadTest implements Runnable{

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName());
	}
	
	
	public static void main(String[] args) {
		StartThreadTest startThreadTest = new StartThreadTest();
		Thread thread = new Thread(startThreadTest, "线程1");
		System.out.println("线程是否启动:" + thread.isAlive());
		thread.start();
		System.out.println("线程是否启动:" + thread.isAlive());
	}
}	

 运行结果:

 线程是否启动:false
 线程是否启动:true
 线程1

线程强行执行(join方法):

 

/**
 * thread强行在main主线程中执行
 * 直到thread执行完后,main主线程才开始执行。
 * 可将大问题分成小问题的思想
 * @author Administrator
 *
 */
public class JoinTest implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + i);
		}
	}

	public static void main(String[] args) throws InterruptedException {
		for (int i = 0; i < 10; i++) {
			if (i == 5) {
				JoinTest joinTest = new JoinTest();
				Thread thread = new Thread(joinTest, "线程1");
				thread.start();
				thread.join();
			}
			System.out.println("main主线程" + i);
		}
		
	}

}

 运行结果:

main主线程0
main主线程1
main主线程2
main主线程3
main主线程4
线程10
线程11
线程12
线程13
线程14
线程15
线程16
线程17
线程18
线程19
main主线程5
main主线程6
main主线程7
main主线程8
main主线程9

 

 线程的中断:

 

/**
 * 如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞, 
 * 那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
 * 
 * 如果线程没有被阻塞,这时调用interrupt()将不起作用
 * @author Administrator
 *
 */
public class ThreadInterupt implements Runnable{

	@Override
	public void run() {
		for(int i = 0; i < 10; i++){
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				System.out.println("线程被中断");
			}
			System.out.println(Thread.currentThread().getName() + " " + i);
		}
	}
	
	public static void main(String[] args) {
		ThreadInterupt interupt = new ThreadInterupt();
		Thread thread = new Thread(interupt);
		thread.start();
		
		thread.interrupt();
	}
}

 后台线程(Daemon Thread):

  JVM的垃圾回收线程就是典型的后台线程,特征:如果所有的前台线程都死亡,后台线程会自动死亡。

 

/**
 * 后台线程的使用
 * @author Administrator
 *
 */
public class DaemonThread extends Thread{
	public void run(){
		for(int i = 0; i < 100; i++){
			System.out.println(this.getName() + "" + i);
		}
	}
	
	public static void main(String[] args) throws Exception{
		DaemonThread dt = new DaemonThread();
		//设定为后台线程
		dt.setDaemon(true);
		dt.start();
		for(int i = 0; i < 10; i++){
			System.out.println(Thread.currentThread().getName() + "" + i);
		}
	}
}
 运行结果:

main0
main1
main2
Thread-00
main3
main4
Thread-01
Thread-02
Thread-03

 

线程的休眠:

 

/**
 * 线程休眠
 * @author Administrator
 *
 */
public class ThreadSleep implements Runnable{

	@Override
	public void run() {
		for(int i = 0; i < 3; i++){
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			System.out.println(Thread.currentThread().getName() + " " + i);
		}
	}
	
	public static void main(String[] args) {
		ThreadSleep sleep = new ThreadSleep();
		new Thread(sleep).start();
	}

}

 

 

线程的让步(yield方法):

 

public class YieldTest extends Thread{
	public YieldTest(String name){
		super(name);
	}
	
	public void run(){
		for(int i = 0; i < 20; i++){
			System.out.println(getName() + "" + i);
			
			if(i == 5){
				Thread.yield();
			}
		}
	}
	
	public static void main(String[] args) {
		YieldTest yt1 = new YieldTest("高级");
		yt1.setPriority(MAX_PRIORITY);
		yt1.start();
		
		YieldTest yt2 = new YieldTest("低级");
		yt2.setPriority(MIN_PRIORITY);
		yt2.start();
	}
}

 

  sleep()方法和yield()方法的区别:

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

   2)sleep()方法会将线程转入阻塞状态,直到经过指定阻塞时间后才转入就绪状态;yield()不会将线程转入阻塞状态,而是强制当前线程进入就绪状态。

   3)sleep()方法声明抛出InterruptedException异常,而yield()方法没有抛出任何异常。

   4)sleep()方法可移植性好于yield()方法,所以不建议用yield()方法控制并发线程的执行。

 

线程的优先级:

   1.MAX_PRIORITY : 10

   2.MIN_PRIORITY:1

   3.NORM_PRIORITY:5

   可通过setsetPriority(MIN_PRIORITY)指定优先级。

 

  • 大小: 339 KB
分享到:
评论

相关推荐

    C#的多线程机制初探(1)C#的多线程机制初探(1)

    C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)

    C#的多线程机制初探(2)

    C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)

    Python多线程机制初探.zip

    Python多线程机制初探

    Vchome资料库--多线程技术篇(CHM)

    Win32 多线程的性能(1)... 1 &lt;br/&gt;Win32 多线程的性能(2)... 10 &lt;br/&gt;关于多线程的一些细节... 23 &lt;br/&gt;用VC++5.0 实 现 多 线 程 的 调 度 和 处 理... 25 &lt;br/&gt;一 多 任 务, 多 进 程 和 多 ...

    Python多线程机制初探.pdf

    Python多线程机制初探.pdf

    c++多线程编程初探

    c++多线程编程初探 HANDLE thread1; HANDLE thread2; thread1=CreateThread(NULL,0,Fun1,NULL,0,NULL); thread2=CreateThread(NULL,0,Fun2,NULL,0,NULL);

    初探c#初探c#初探c#初探c#初探c#初探c#

    以前在使用VB来实现多线程的时候,发现有一定的难度。虽然也有这样那样的方法,但都不尽人意,但在C#中,要编写多线程应用程序却相当的简单。这篇文章将作简要的介绍,以起到抛砖引玉的作用! .NET将关于多线程的...

    C++11 并发指南之多线程初探

    相信 Linux 程序员都用过 Pthread, 但有了 C++11 的 std::thread 以后,你可以在语言层面编写多线程程序了,直接的好处就是多线程程序的可移植性得到了很大的提高,所以作为一名 C++ 程序员,熟悉 C++11 的多线程...

    C语言文件操作、多线程编程和网络编程.md

    目录: ...多线程编程初探 3.1 线程的基本概念 3.2 创建与同步线程 网络编程基础 4.1 套接字的概念与创建 4.2 服务器与客户端通信 高级文件操作 5.1 顺序文件与随机文件 5.2 文件的读写位置与偏移

    Android 线程池、信号量、Looper、缓存初探

    这个例子是一个多线程的加载图片实例,不是很完善,毕竟是初探,共同学习,共同进步吧。

    C语言高级编程技巧与数据结构.md

    目录: 函数指针与回调函数 1.1 函数指针的定义与使用 1.2 回调函数的概念 枚举与位操作 2.1 枚举类型的定义与应用 2.2 位操作与位运算 ...多线程编程初探 6.1 线程的基本概念 6.2 创建与同步线程

    详解Python并发编程之从性能角度来初探并发编程

    多线程 多进程 协程(生成器) 在之后的章节里,将陆陆续续地给大家介绍到这三个知识点。 . 并发编程的基本概念 在开始讲解理论知识之前,先过一下几个基本概念。虽然咱是进阶教程,但我也希望写得更小白,

    C#基础系列:异步编程初探async和await

    前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友说到了async, await等新语法。确实,没有异步的多线程是单调的、乏味的,async和await是出现在C#5.0之后,它的出现给了异步并行变成带来了很大的方便...

    QCon广州 2019年全球软件开发大会PPT合集(30份).zip

    构建多线程的 Electron 应用和性能优化实践 高可用的深度学习技术架构 高并发场景下分布式实时信令系统的架构实践 动静相宜基于 JS 和 C++ 实现移动端⾼性能、强动态的视频 AR 拍摄框架 从 Darknet 到 Tensorfow- ...

    Java-program-design-.rar_Java 8

    第1章-计算机基础 第2章-Java初探 第3章-Java程序基础 第5章-方法和数组 第8章-多线程。。。。。

    JAVA学习手册CHM版

    第2篇为核心篇,包括字符串处理、集合类、使用异常处理机制、掌握Java的I/O技术、精通多线程技术、枚举与泛型;第3篇为高级篇,包括Swing基础知识、JDBC技术、Swing高级组件、GUI事件处理机制、网络程序设计;第4篇...

    Go语言初探 搭建Mac环境

    但是,大多数现代编程语言(如Java,Python等)都来自90年代的单线程环境。虽然一些编程语言的框架在不断地提高多核资源使用效率,例如 Java 的 Netty 等,但仍然需要开发人员花费大量的时间和精力搞懂这些框架的...

    Dubbo框架初探

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个...2.集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失

Global site tag (gtag.js) - Google Analytics