黑马程序员——Java基础——多线程
来源:互联网 发布:数据库建模工具有哪些 编辑:程序博客网 时间:2024/06/05 09:22
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一、多线程概念
1、线程与进程
a、进程就是一个运行中的程序。
b、一个进程中可以有多个线程,线程是CPU调度和分派的基本单位。我们可以理解为线程就是程序运行中的一条路径。
2、多线程存在的意义
a、允许多个线程并发执行,提高程序运行效率。
b、例如:迅雷多线程下载,QQ多个人同时聊天,凌波多个人同时共享屏幕。
二、线程的使用
1、创建线程有两种方式
a、自定义一个类继承Thread类,将线程要做的事写在run()方法中,由于子类可以当父类来用,创建自定义子类对象就是创建了一个线程。
例:
class Demo extends Thread
{
public void run(){
for(int x=0;x<60;x++)
System.out.println("demo run----"+x);
}
}
class ThreadDemo
{
public static void main(String[] args)
{
Demo d=new Demo();
d.start();
for(int x=0;x<60;x++)
System.out.println("hello world"+x);
}
}
结果如下:
hello world0
demo run----0
hello world1
demo run----1
hello world2
demo run----2
hello world3
demo run----3
hello world4
demo run----4
hello world5
demo run----5
demo run----6
hello world6
demo run----7
hello world7
demo run----8
hello world8
demo run----9
hello world9
demo run----10
hello world10
demo run----11
hello world11
demo run----12
hello world12
hello world13
demo run----13
hello world14
hello world15
hello world16
demo run----14
hello world17
demo run----15
demo run----16
demo run----17
hello world18
demo run----18
hello world19
demo run----19
hello world20
demo run----20
hello world21
demo run----21
hello world22
demo run----22
hello world23
demo run----23
hello world24
demo run----24
hello world25
demo run----25
hello world26
demo run----26
hello world27
demo run----27
hello world28
demo run----28
hello world29
hello world30
demo run----29
hello world31
demo run----30
hello world32
hello world33
demo run----31
hello world34
demo run----32
hello world35
demo run----33
hello world36
demo run----34
hello world37
demo run----35
hello world38
demo run----36
hello world39
demo run----37
hello world40
demo run----38
hello world41
demo run----39
demo run----40
demo run----41
demo run----42
demo run----43
demo run----44
demo run----45
demo run----46
demo run----47
hello world42
demo run----48
hello world43
demo run----49
hello world44
demo run----50
hello world45
demo run----51
hello world46
hello world47
demo run----52
hello world48
demo run----53
demo run----54
demo run----55
demo run----56
demo run----57
demo run----58
demo run----59
hello world49
hello world50
hello world51
hello world52
hello world53
hello world54
hello world55
hello world56
hello world57
hello world58
hello world59
b、自定义一个类实现Runnable接口,将要做的事写在run()方法中。创建Thread对象时在构造函数中传入Runnable实现类对象。
2、线程的启动
a、两种创建方式都是调用Thread对象的start()方法。
b、当调用start()方法时,CPU会开启一条新线程,并在新线程上执行run()方法。
3、线程常用方法
a、currentThread
静态方法,用来获取当前线程
b、getName、setName
用来获取、设置当前线程的名字
c、sleep
控制线程休眠,单位为毫秒
d、setDaemon
将线程设置为守护线程。线程默认是非守护线程,守护线程不能单独执行。
e、join
当前线程暂停,等待加入的线程运行结束,当前线程继续执行。
三、多线程同步
1、线程安全问题
a、多线程并发访问同一数据,有可能出现线程安全问题。
b、一条线程的访问还没有结束,CPU切换到另一条线程工作,导致数据访问出错。
2、使用同步解决线程安全问题
a. 使用同步代码块synchronized(锁对象){需要同步的代码...}形式将访问数据的代码锁住,在同步代码块中的内容同一时间内只能一个线程执行。
b. 使用同步方法,用synchronized修饰方法,整个方法的代码都是同步的,只能一个线程运行。同步方法使用this作为锁。
3、死锁
在多个线程并发执行使用多个锁来同步时,有可能互相冲突,导致程序无法继续执行。
4、同步的优点与缺点
a、同步可以解决多个线程同时访问一个共享数据的问题,只要加上同一个锁,在同一时间内只能有一条线程执行。
b、在执行同步代码时每次都会判断锁,非常消耗资源,效率较低。
四、多线程通信
1、在同步代码中可以使用锁对象的wait()方法让当前线程等待
2、使用锁对象的notify()方法可以将正在等待的线程唤醒
3、如果多个线程都在等待,notify()唤醒随机1个
4、notifyAll()方法可以唤醒所有在等待的线程
五、JDK5之后的线程同步与通信
1、同步
a、使用java.util.concurrent.locks.Lock接口的实现类对象来进行同步
b、ReentrantLock就是Lock的实现类,可以实现synchronized的功能
c、在需要同步的代码块前后使用lock()和unlock()方法来完成同步
d、unlock()最好放在finally中,因为如果上面代码抛出异常没有解锁的话,会导致其他线程无法运行,程序卡死。
2、通信
a、使用Lock对象的newCondition()方法获取一个Condition对象,Condition对象可以控制指定线程的等待与唤醒。
b、await()方法可以控制线程等待。
c、signal()方法可以唤醒等待的线程。
d、signalAll()方法可以唤醒所有等待线程。
总结:在敲代码的过程中,还是会遇到一些问题,可能是有些概念还是没弄懂,但是多找找资料,多想想也慢慢弄懂了。
- 黑马程序员——Java基础---多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员——java基础---多线程
- 黑马程序员——Java基础多线程
- 黑马程序员——Java基础->多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员——java基础---多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员——java基础--多线程
- 黑马程序员——java基础--多线程
- 黑马程序员——Java基础--- 多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员——Java基础---多线程
- 黑马程序员——java基础-多线程
- 黑马程序员——Java基础:多线程
- javascript
- tcp/ip --------- IP选路
- 九度1104:整除问题
- Java加密系列之(四)对称加密算法
- 超过 130 个你需要了解的 vim 命令
- 黑马程序员——Java基础——多线程
- 斐波那契数列及相关问题
- json使用键值解析方法
- Eclipse中切换SVN账号
- 【AJAX探索之路系列】之一:AJAX开篇
- struts2--中
- 对于Java中多线程互斥锁初步了解
- 关于重定向和转发的理解
- 初始化 赋值 拷贝