Java 线程(Thread)基础知识概括
来源:互联网 发布:淘宝如何追加评价 编辑:程序博客网 时间:2024/04/27 22:40
- 线程基本概念
- 通过实现Runnable接口来创建线程
- 通过继承Thread来创建线程
- 俩种实现方法比较
参考
http://www.runoob.com/java/java-multithreading.html
http://www.infoq.com/cn/articles/cf-java-thread
https://www.ibm.com/developerworks/cn/java/multithreading/#ibm-pcon(其实看这个就够了)
线程基本概念
- 进程(process):有一个包含了程序内容和数据的地址空间,以及其它的资源,包括打开的文件、子进程和信号处理器等。不同进程的地址空间是互相隔离的。
- 线程(thread):表示的是程序的执行流程,是CPU调度的基本单位。线程有自己的程序计数器、寄存器、栈和帧等。引入线程的动机在于操作系统中阻塞式I/O的存在。当一个线程所执行的I/O被阻塞的时候,同一进程中的其它线程可以使用CPU来进行计算。这样的话,就提高了应用的执行效率。线程的概念在主流的操作系统和编程语言中都得到了支持。
- 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销
- 包含关系: 一个进程(process)包括由操作系统分配的内存空间,包含一个或多个线程(thread)。
- 目的:多线程能满足程序员编写高效率的程序来达到充分利用CPU的目的
- 生命周期:新建-就绪-运行-(阻塞)-死亡
- **线程优先级:**Java线程的优先级是一个整数,其取值范围是1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )
- 可见性:可见性(visibility)的问题是Java多线程应用中的错误的根源。
- 锁 同步 中断线程
- > 详见 http://www.infoq.com/cn/articles/cf-java-thread
通过实现Runnable接口来创建线程
package Thread;/** * Created by zhangzexiang on 2016/9/9. * * 创建一个线程方法之一:通过实现Runnable接口来创建线程 * * 重写 public void run() * 理解run()可以调用其他方法,使用其他类,并声明变量,就像主线程一样 * * 在类中先实例化一个线程对象 * 常用: Thread(Runnable threadOb, String threadName); * threadOb :是一个实现Runnable接口的类的实例 * threadName :指定线程的名字 * * * 新线程创建之后,你调用它的start()方法它才会运行。 * * */public class NewThread{ public static void main(String args[]){ new NewThread1(); //create new thread try{ for(int i=5; i>0; i--){ System.out.println("Main Thread "+i); Thread.sleep(100); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main thread exiting"); }}//创建一个新的线程 class NewThread1 implements Runnable { Thread t; NewThread1(){ //创建第二个新线程 t = new Thread(this,"Demo Thread"); System.out.println("child thread: " + t); t.start(); //begin thread } //the second thread entrance(入口) @Override public void run() { try{ for(int i=5; i>0; i--){ System.out.println("chaild thread:" + i); //pause thread Thread.sleep(50); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Exiting child thread"); }}
运行结果
child thread: Thread[Demo Thread,5,main]Main Thread 5chaild thread:5chaild thread:4Main Thread 4chaild thread:3chaild thread:2Main Thread 3chaild thread:1Exiting child threadMain Thread 2Main Thread 1main thread exiting
主方法算是第一个线程,且不用start() 不用run()就可以运行(自己猜的)
第二个线程先用构造函数创建,然后用其方法运行
通过继承Thread来创建线程
package Thread;/** * Created by zhangzexiang on 2016/9/9. * * 通过继承Thread来创建线程 * * * 创建一个线程的第二种方法是创建一个新的类,该类继承Thread类,然后创 建一个该类的实例。 * 继承类必须重写run()方法,该方法是新线程的入口点。它也必须调用*start()方法才能执行。 */public class ExtendThread { public static void main(String args[]) { new NewThread2(); // 创建一个新线程 try { for(int i = 5; i > 0; i--) { System.out.println("Main Thread: " + i); Thread.sleep(100); } } catch (InterruptedException e) { System.out.println("Main thread interrupted."); } System.out.println("Main thread exiting."); }}class NewThread2 extends Thread { NewThread2() { // 创建第二个新线程 super("Demo Thread"); System.out.println("Child thread: " + this); start(); // 开始线程 } // 第二个线程入口 public void run() { try { for(int i = 5; i > 0; i--) { System.out.println("Child Thread: " + i); // 让线程休眠一会 Thread.sleep(50); } } catch (InterruptedException e) { System.out.println("Child interrupted."); } System.out.println("Exiting child thread."); }}
运行结果
Child thread: Thread[Demo Thread,5,main]Main Thread: 5Child Thread: 5Child Thread: 4Main Thread: 4Child Thread: 3Child Thread: 2Child Thread: 1Main Thread: 3Exiting child thread.Main Thread: 2Main Thread: 1Main thread exiting.
俩种实现方法比较
http://blog.csdn.net/ns_code/article/details/17161237
这篇博客评论中有歧义,我也不是很明白谁对谁错,总之网上的东西不一定都对,博客也是
Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下优势:
1、可以避免由于Java的单继承特性而带来的局限;2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;3、适合多个相同程序代码的线程区处理同一资源的情况。
package Thread;/** * Created by zhangzexiang on 2016/9/9. * * 火车票出售实例 */public class TestTicket { public static void main(String[] args) { Resource rs = new Resource(20); //new几个Thread相当于有几个售票窗口 //如下可以用4个窗口同时售卖 new Thread(new Seller(1,rs)).start(); new Thread(new Seller(2,rs)).start(); new Thread(new Seller(3,rs)).start(); new Thread(new Seller(4,rs)).start(); } static class Resource { int ticketNum = 50; boolean flag = false ; // 定义票是否卖完 public Resource(){} public Resource(int num) { this.ticketNum = num; }//这里保证售卖的票不是同一张票 ---》 synchronized public synchronized void sellTicket(Seller s) { if (ticketNum > 0) { System.out.println("第" + s.num + "售票点卖出了第" + ticketNum + "张票……"); ticketNum--; } else { flag = true; } } } /** * 售票点类 * */ static class Seller implements Runnable { int num; Resource rs; public Seller(int num,Resource rs) { this.num = num; this.rs = rs; } public final void run() { while (!rs.flag) { /** * 调用资源类的同步方法 */ rs.sellTicket(this); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }}
程序运行结果(1秒刷4行)
第1售票点卖出了第20张票……第3售票点卖出了第19张票……第2售票点卖出了第18张票……第4售票点卖出了第17张票……第1售票点卖出了第16张票……第3售票点卖出了第15张票……第4售票点卖出了第14张票……第2售票点卖出了第13张票……第2售票点卖出了第12张票……第1售票点卖出了第11张票……第4售票点卖出了第10张票……第3售票点卖出了第9张票……第4售票点卖出了第8张票……第1售票点卖出了第7张票……第2售票点卖出了第6张票……第3售票点卖出了第5张票……第1售票点卖出了第4张票……第3售票点卖出了第3张票……第2售票点卖出了第2张票……第4售票点卖出了第1张票……Process finished with exit code 0
0 0
- Java 线程(Thread)基础知识概括
- Java中线程(Thread)知识概括
- java基础知识概括(一)
- Java基础知识的概括
- Java——Thread线程基础知识学习
- 多线程基础知识(图片概括)
- Javase基础知识概括(一)
- Java基础知识概括总结一 Java入门
- Java基础知识概括总结二 基本类型
- Java基础知识概括总结三 运算符
- Java Thread (线程)总结
- Java Thread 总结(线程)
- Java线程(Thread)调度
- Java线程Thread(一)
- Java线程Thread(二)
- Java线程Thread(三)
- java基础知识(十九)线程
- Java 线程安全性(thread-safe)
- CPU流水线的探秘之旅
- tomcat中<server.xml>用到的端口的各自功能
- Fraement的生命周期和activity的关系
- 实现FreeMarker+Ajax的无刷新分页
- parseRequest(request)为空的问题
- Java 线程(Thread)基础知识概括
- 记录遇到的Python陷阱和注意点
- HDU 1130 How Many Trees?
- yum安装php7.0可以改变yum源
- Android学习路线的归纳总结,绝对干货!
- 学习笔记:relocation R_X86_64_32 against `.rodata' can not be used when making a shared object;
- 按照 老罗博客学习安卓 记录
- CCF 201403-3 命令行选项
- 插播-IT书目