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)指定优先级。
相关推荐
C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)
C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)C#的多线程机制初探(1)
Python多线程机制初探
Win32 多线程的性能(1)... 1 <br/>Win32 多线程的性能(2)... 10 <br/>关于多线程的一些细节... 23 <br/>用VC++5.0 实 现 多 线 程 的 调 度 和 处 理... 25 <br/>一 多 任 务, 多 进 程 和 多 ...
Python多线程机制初探.pdf
c++多线程编程初探 HANDLE thread1; HANDLE thread2; thread1=CreateThread(NULL,0,Fun1,NULL,0,NULL); thread2=CreateThread(NULL,0,Fun2,NULL,0,NULL);
以前在使用VB来实现多线程的时候,发现有一定的难度。虽然也有这样那样的方法,但都不尽人意,但在C#中,要编写多线程应用程序却相当的简单。这篇文章将作简要的介绍,以起到抛砖引玉的作用! .NET将关于多线程的...
相信 Linux 程序员都用过 Pthread, 但有了 C++11 的 std::thread 以后,你可以在语言层面编写多线程程序了,直接的好处就是多线程程序的可移植性得到了很大的提高,所以作为一名 C++ 程序员,熟悉 C++11 的多线程...
目录: ...多线程编程初探 3.1 线程的基本概念 3.2 创建与同步线程 网络编程基础 4.1 套接字的概念与创建 4.2 服务器与客户端通信 高级文件操作 5.1 顺序文件与随机文件 5.2 文件的读写位置与偏移
这个例子是一个多线程的加载图片实例,不是很完善,毕竟是初探,共同学习,共同进步吧。
目录: 函数指针与回调函数 1.1 函数指针的定义与使用 1.2 回调函数的概念 枚举与位操作 2.1 枚举类型的定义与应用 2.2 位操作与位运算 ...多线程编程初探 6.1 线程的基本概念 6.2 创建与同步线程
多线程 多进程 协程(生成器) 在之后的章节里,将陆陆续续地给大家介绍到这三个知识点。 . 并发编程的基本概念 在开始讲解理论知识之前,先过一下几个基本概念。虽然咱是进阶教程,但我也希望写得更小白,
前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友说到了async, await等新语法。确实,没有异步的多线程是单调的、乏味的,async和await是出现在C#5.0之后,它的出现给了异步并行变成带来了很大的方便...
构建多线程的 Electron 应用和性能优化实践 高可用的深度学习技术架构 高并发场景下分布式实时信令系统的架构实践 动静相宜基于 JS 和 C++ 实现移动端⾼性能、强动态的视频 AR 拍摄框架 从 Darknet 到 Tensorfow- ...
第1章-计算机基础 第2章-Java初探 第3章-Java程序基础 第5章-方法和数组 第8章-多线程。。。。。
第2篇为核心篇,包括字符串处理、集合类、使用异常处理机制、掌握Java的I/O技术、精通多线程技术、枚举与泛型;第3篇为高级篇,包括Swing基础知识、JDBC技术、Swing高级组件、GUI事件处理机制、网络程序设计;第4篇...
但是,大多数现代编程语言(如Java,Python等)都来自90年代的单线程环境。虽然一些编程语言的框架在不断地提高多核资源使用效率,例如 Java 的 Netty 等,但仍然需要开发人员花费大量的时间和精力搞懂这些框架的...
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个...2.集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失