线程分享
来源:互联网 发布:centos jira mysql 编辑:程序博客网 时间:2024/06/17 20:55
1.什么是线程
* 线程是程序执行的一条路径, 一个进程中可以包含多条线程.
*多线程并发执行可以提高程序的效率, 可以同时完成多项工作.2.什么是多线程(多线程并行和并发的区别)
* 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)
* 并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。
3.多线程的实现方式多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程
通过查看源码,thread实现了runnable接口
①.继承Thread
package it.thread;public class Test1 extends Thread {/** * 手动重写run方法 */public void run() {//super.run();for (int i = 0; i <1000; i++) {System.out.println("aaaaa");}}//结果是aaaabbbb会交替输出public static void main(String[] args) {Test1 test1 = new Test1();//开启线程,调用run方法test1.start();for (int i = 0; i < 1000; i++) {System.out.println("bbbb");}}}
②实现Runnable
package it.runnable;public class MyRunnable implements Runnable{public void run() {for (int i = 0; i < 1000; i++) {System.out.println("bbbb");}}//结果也是aaabbb乱序交替输出。public static void main(String[] args) {//接口的子类thread开启线程Thread thread = new Thread(new MyRunnable());thread.start();for (int i = 0; i < 1000; i++) {System.out.println("aaaa");}}}当然我们也可以使用匿名内部类来开启多条线程.
1.package it.thread;2.3.public class Demo4_Thread {4.5./**6. * @param args7. */8.public static void main(String[] args) {9.//继承Thread类10.new Thread() {//1,继承Thread类11.public void run() {//2,重写run方法12.for(int i = 0; i < 1000; i++) {//3,将要执行的代码写在run方法中13.System.out.println("aaaaaaaaaaaaaa");14.}15.}16.}.start();//4,开启线程17.//实现Runnable接口18.new Thread(new Runnable() {//1,将Runnable的子类对象传递给Thread的构造方法19.public void run() {//2,重写run方法20.for(int i = 0; i < 1000; i++) {//3,将要执行的代码写在run方法中21.System.out.println("bb");22.}23.}24.}).start();//4,开启线程25.}26.27.}
4.两种方法的比较
* 继承Thread
好处是:可以直接使用Thread类中的方法,代码简单
弊端是:如果已经有了父类,就不能用这种方法
* 实现Runnable接口
好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂
5.常用方法Thread.sleep(毫秒) :休眠当前线程
Thread.get/setName(String) :获取/设置当前线程的名字
Thread.setDaemon(boolean b), 设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 自动退出
Thread.setPriority(int i):i的取值范围为1到10,数值越大,优先级越高Thread.yield():礼让线程,让出cpu
6.火车站售票经典实例模仿
package it.runnable;//火车站售票public class Test4 {public static void main(String[] args) {Ticket t = new Ticket();new Thread(t).start();new Thread(t).start();new Thread(t).start();new Thread(t).start();}}class Ticket implements Runnable{private int tk = 100;public void run() {while(true){synchronized (Ticket.class) {if (tk<=0) {break;}try { //睡0.1秒 Thread.sleep(100);} catch (Exception e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "...这是第" + tk-- + "号票");}}}}6.线程安全就是在源码中加入了synchronized锁.
可以查看其源码如:未完待续Vector是线程安全的,ArrayList是线程不安全的
StringBuffer是线程安全的,StringBuilder是线程不安全的
Hashtable是线程安全的,HashMap是线程不安全的
最后,这里有一些关于线程问题和解答,大家可以去看一下:http://blog.jobbole.com/76308/
- 线程分享
- 线程学习经验分享
- 经验分享,如何写线程
- 分享一个事务处理线程类
- 分享一个java线程专栏
- 分享一个c线程池实现代码
- 技术分享-Java(Android)线程池
- 分享一种线程池实现方法
- 【传智播客郑州校区分享】线程精进指南
- 分享:超线程多核心Java多线程编程分析
- [分享]Java 线程池的原理与实现
- C# 文件去只读工具-线程-技术&分享
- [分享]Java 线程池的原理与实现
- 【好程序员笔记分享】——进程和线程
- 分享一个C++11写的线程池
- java线程池的使用及案例分享
- Linux下JAVA线程占用CPU高一点分享
- 【腾讯Bugly干货分享】经典随机Crash之一:线程安全
- 基于java类库的签名算法实现
- linux初级学习之ftp服务2-9
- 项目记录-圆形边缘修正方法探索3
- HDU 1010 Tempter of the Bone DFS基础剪枝题 被剪枝伤害到了 好烦
- gspcavl.patch
- 线程分享
- Unreal Engin_画廊制作笔记 _006<灯光处理,静态灯光的设置>
- Java Web的数据库操作
- Redis系列(6)——RedisTemplate操作模板
- 8086汇编学习之代码段、数据段、栈段与段地址寄存器
- 请求https 的学习例子之一( httpUrlconn)
- JavaBean中布尔类型使用注意
- 使用Twemproxy搭建redis服务器集群
- 随机抽样一致算法(Random sample consensus,RANSAC)