黑马程序员——javaSE_多线程
2015-11-28 10:51
363 查看
-------
android培训、java培训、期待与您交流! ----------
进程:正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。
线程:其实就是进程中一个程序执行控制单元,一条执行路径。进程负责的是应用程序的空间的标示。线程负责的是应用程序的执行顺序。
进程中最少有一个线程
多线程特性
1.随机性
2.谁强盗谁执行,至于执行多长,由CPU说了算
返回当前线程的名称:Thread.currentThread().getName()
线程的名称是由:Thread-编号定义的。编号从0开始。
线程要运行的代码都统一存放在了run方法中。
线程要运行必须要通过类中指定的方法开启。start方法。(启动后,就多了一条执行路径)
start方法:1)、启动了线程;2)、让jvm调用了run方法。
创建线程的第一种方式:继承Thread ,由子类复写run方法
实现方式的好处:避免了单继承的局限性
获取线程名称:getName(); Thread-编号 编号从0开始
解决方法:对个线程操作共享的语句,只能让一个线程执行完,在执行的过程中,其他线程不可以参与进来执行。
java提供了解决多线程安全问题的方式,就是同步
好处:解决了线程安全问题。
弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁。
2.必须是多个线程使用同一个锁
2.同步函数,固定是this锁
3.静态同步函数,固定是所属类名.class
举例(多线程卖票例子)
线程间的通讯:就是多个线程在操作同一个资源,但是操作动作不同
wait和sleep的区别
wait:释放资源释放锁,必须要调用notify才能唤醒
sleep:释放资源不释放锁,可以定义时间,时间一到自动就醒了
2.定义循环标记,让循环退出,让run方法结束
android培训、java培训、期待与您交流! ----------
进程:正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。
线程:其实就是进程中一个程序执行控制单元,一条执行路径。进程负责的是应用程序的空间的标示。线程负责的是应用程序的执行顺序。
进程中最少有一个线程
多线程特性
1.随机性
2.谁强盗谁执行,至于执行多长,由CPU说了算
返回当前线程的名称:Thread.currentThread().getName()
线程的名称是由:Thread-编号定义的。编号从0开始。
线程要运行的代码都统一存放在了run方法中。
线程要运行必须要通过类中指定的方法开启。start方法。(启动后,就多了一条执行路径)
start方法:1)、启动了线程;2)、让jvm调用了run方法。
创建线程的第一种方式:继承Thread ,由子类复写run方法
public class Test { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); } } class MyThread extends Thread{ public void run(){ for(int x = 1;x<=100;x++){ System.out.println(x); } } }创建线程的第一种方式:实现Runnable接口,实现run方法
实现方式的好处:避免了单继承的局限性
public class Test { public static void main(String[] args) { MyThread m = new MyThread(); //创建该对象 Thread t = new Thread(m);//建立Thread对象把实现了Runnable接口的对象以参数形式传入Thread构造函数中 t.start();//调用start方法开启线程 } } class MyThread implements Runnable{ public void run(){ for(int x = 1;x<=100;x++){ System.out.println(x); } } }
获取线程名称:getName(); Thread-编号 编号从0开始
多线程的安全问题
问题原因:当多个线程在操作同一个共享数据时,一个线程执行了一部分,还没执行,另一个线程参与进来了,导致数据的错误。解决方法:对个线程操作共享的语句,只能让一个线程执行完,在执行的过程中,其他线程不可以参与进来执行。
java提供了解决多线程安全问题的方式,就是同步
好处:解决了线程安全问题。
弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁。
同步的前提
1.必须有两个以上的线程2.必须是多个线程使用同一个锁
同步有三种
1.同步代码块,可以使用任意对象作为锁2.同步函数,固定是this锁
3.静态同步函数,固定是所属类名.class
举例(多线程卖票例子)
public class Test { public static void main(String[] args) { Sell s = new Sell(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); t1.start(); t2.start(); } } class Sell implements Runnable{ private int PI = 100; Object obj = new Object(); public void run() { while(true){ synchronized(obj){ if(PI>0){ System.out.println(Thread.currentThread().getName()+"..."+PI--); } } } } }
线程间的通讯:就是多个线程在操作同一个资源,但是操作动作不同
wait和sleep的区别
wait:释放资源释放锁,必须要调用notify才能唤醒
sleep:释放资源不释放锁,可以定义时间,时间一到自动就醒了
停止线程
1.run方法结束2.定义循环标记,让循环退出,让run方法结束
守护线程(setDaemon())
当进程中只剩下守护线程,该进程就结束退出。相关文章推荐
- 成为一名更好的程序员:如何阅读源代码
- 黑马程序员——javaSE_异常
- 一个java程序员自学IOS开发之路(九)
- 大多数程序员最重要的应该学习什么?
- 程序员的楷模:全自动化的生活
- 程序员的楷模:全自动化的生活
- 黑马程序员——java入门基础知识
- 面试时必须准备的100 个关键问题!
- Java中String对象创建机制详解(面试必问)
- 阻止资深程序员技术进步的最大敌人就是开始做管理,做管理至少毁了中国90%的好程序员。
- 黑马程序员--面向对象(day06)
- 面向对象的三大特性?(java面试题)
- 黑马程序员--杨辉三角形问题
- 黑马程序员—Java基础—正则表达式
- Java 面试题目小结(未完待续)
- 斐波那契数列 兔子表述 面试题
- 程序员必备技能与习惯
- Scrum Master 面试题 – 你必须知道的22个Scrum基础知识
- Scrum Master 面试题 – 你必须知道的22个Scrum基础知识
- Scrum Master 面试题 – 你必须知道的22个Scrum基础知识