java多线程
2015-09-13 18:25
387 查看
概念
流程:一个正常的程序运行。每个程序都有一个运行顺序。这个序列是一个运行路径,或致电控制单元。
程: 就是进程中的一个独立的控制单元,线程在控制着进程的运行。
一个进程中至少有一个线程。或者说至少一个控制单元。
样例:jvm启动不止一个线程,还有负责垃圾回收的线程。
创建线程方式一
继承Thread类步骤:
1、定义类继承Thread
2、复写Thread类中的run方法
目的:把自己定义代码,放在run方法中,让线程运行。
3、调用线程中的start方法
start方法有两个作用。启动线程和调用run方法
通过运行这样的方法的运行结果的每次都不一样,由于多个线程获取CPU的运行权,CPU运行到谁。谁就运行。
也就是说,在某一个时刻,仅仅能有一个程序运行(多核CPU除外),CPU做着高速的切换。以达到看上去是同一时候运行的效果。
我们能够形象的把多线程的运行是互相争夺CPU的运行权。
多线程的一个特性:随机性
package com.vobile; class Test extends Thread { public void run(){ for (int j = 0; j < 20; j++){ System.out.println("j = " + j + "-------------"); } } } class ThreadDemo1{ public static void main(String[] args){ Test test = new Test(); //创建一个线程 test.start(); for(int i = 0; i<20; i++){ System.out.println("i= " + i + "+++++++++++++++++"); } } } //运行结果 i= 0+++++++++++++++++ i= 1+++++++++++++++++ j = 0------------- i= 2+++++++++++++++++ j = 1------------- i= 3+++++++++++++++++ j = 2------------- i= 4+++++++++++++++++ j = 3------------- i= 5+++++++++++++++++ j = 4------------- ……
获取线程的名称 和对象
名称线程都有自己默认的名称
线程的名字为:thread-编号 编号从0開始
获取名称:getName()
设置名称:setName(); 或者构造函数的方式进行名称设置
获取对象
static Thread currentThread();方法
创建线程方式二
实现Runnable接口1、子类覆盖接口中的run方法。
2、通过Thread类创建线程,并将实现了Runnable接口的子类对象作为參数传递给Thread类的构造函数。
3、Thread类对象调用start方法开启线程。
多线程安全问题
比如:买票问题,出现了不该出现的票问题原因:
当多条语句在操作同一个线程的共享数据时,一个线程对多条语句仅仅运行了一部分,还没有运行完成,而还有一个线程參与进来运行,导致共享数据错误。
解决的方法
对多条操作共享数据的语句。仅仅能让一个线程运行完,在运行过程中,其它线程不能够參与运行。
对象如同锁。持有锁的线程能够在同步中运行。没有锁的线程,即使获得CPU的运行权,也进不去。
由于没有获取锁。
同步的前提
1、必须使用2个或以上的线程
2、必须多个线程使用同一个锁
同步的优点
解决可多线程的安全问题
同步的缺点
多个线程都须要推断锁,较为消耗性能
待续…
package com.vobile; /** * 三个线程交替运行 * */ class Test extends Thread { private String name; public Test(String name){ this.name = name; } public void run(){ for (int j = 0; j < 20; j++){ System.out.println(this.name + " test run... " + j); } } } class ThreadDemo1{ public static void main(String[] args){ Test test1 = new Test("one"); //创建一个线程 Test test2 = new Test("two"); test1.start(); test2.start(); for(int i = 0; i<20; i++){ System.out.println("main ... " + i); } } }
相关文章推荐
- Java并发编程:线程池的使用
- 解决在windows的eclipse上面运行WordCount程序出现的一系列问题详解
- java编程---万年历
- java String分类trim,substring,replaceAll,indexOf使用功能
- java中接口有什么作用?请创建一个接口(举例)
- java程序性能优化第三章
- java__泛型
- Spring MVC @ResponseBody 提示 406 The resource identified by this request……
- Java记录 -28- String Literals字面值
- apktool + eclipse 调试smali
- java-使用SImpleDateFormat格式化时间输出
- Java记录 -27- String的intern方法
- springMVC是线程安全的吗?
- spring mvc jsp页面无法解析
- java中vector与arraylist的区别
- spring+struts2实现上海市市区街道级联
- ArrayList底层实现(JAVA)
- 关于spring整合hibernate 懒加载异常解决方案
- Java I/O重定向
- Spring MVC POST中文乱码解决方案