黑马程序员_多线程
来源:互联网 发布:php 文章内链 编辑:程序博客网 时间:2024/05/24 05:44
android培训、java培训、期待与您交流!
进程:正在执行中的程序(准确来说是:程序的执行)
每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
每个进程对应一个PCB(Process Control Block),这是进程存在的标志。
线程:线程是进程中一个独立的控制单元,控制着进程的执行。
每个线程对应一个TCB(Thread Control Block)。
一个进程至少对应一个线程。
--------------------------------------------------------------------------------------------------
一、如何在自己的代码中自定义一个线程?
创建线程的第一种方式:继承Thread类。
1.定义类继承Thread类
2.复写Thread类中的run()方法,将自定义的代码存储在run()中,让其运行。
3.调用线程的start方法:启动线程;调用run方法
创建线程的第二种方式:实现Runnable接口。
1.定义类实现Runnable接口
2.覆盖Runnable接口中的run方法
***将线程要运行的内容存放在run方法中。
3.通过Thread类建立线程对象。
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
***原因:
***自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程去执行指定 对象的run方法。
5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
******实现方式和继承方式有什么区别的?
******1.实现方式的好处:避免了单继承的局限性。定义线程时,建议使用实现方式。
******2.继承Thread:线程代码存放在Thread子类run方法中;实现Runnable:存放在接口子类的run方法中.
注意:start会开启线程,如果不使用,线程只是创建并未开启,run方法的调用和一般用法无异。
--------------------------------------------------------------------------------------------------
多线程的安全问题:
出现的原因:
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没执行完,
另一个线程参与进来执行,会导致共享数据的错误。
Java对于多线程的安全问题的解决方式:同步代码块(临界区代码)
synchronized(对象)
{
需要被同步的代码;
}
对象如同锁。持有锁的线程可以在同步中执行。没有持有锁的线程,即使获取了执行权,也无法进入。
同步的前提:
1.必须要有两个或者两个以上的线程。
2.必须是多个线程使用同一个锁。
3.只能有一个线程在执行状态。
* /
--------------------------------------------------------------------------------------------------
/ *
--------------------------------------------------------------------------------------------------
需求:银行有一个金库。
三个储户分别存300元,每次存100,存3次。
练习目的:该程序的安全问题解决
分析:
1.明确哪些代码是多线程运行代码
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据的。
class Bank
{
private int sum;
public void add(int x){
sum = sum + x;
System.out.println("sum=:"+sum);
}
}
class Customer implements Runnable
{
Bank b = new Bank();
Object obj = newObject();
public void run(){
for (int time=0;time<3 ;time++ ){
synchronized(obj)
{
System.out.println(Thread.currentThread().getName()+"..."+time+":"+"100");
b.add(100);
}
}
}
}
class ThreadDemo
{
public static void main(String[] args)
{
Customer ctm=new Customer();
Thread t1 = newThread(ctm);
Thread t2 = newThread(ctm);
Thread t3 = newThread(ctm);
t1.start();
t2.start();
t3.start();
}
}
【回顾】同步与单例设计模式:
懒汉式:
class Single
{
public static Single s= null;
private Single(){};
public static SinglegetInstance(){ //如果直接定义成同步函数,判断次数过多,效率低
if(s ==null){ //使得后续使用该对象过程中,不再进行synchronized判断,提高效率
synchronized(Single.class){
if(s == null){
s = new Single();
}
}
}
return s;
}
}
--------------------------------------------------------------------------------------------------
同步会产生的矛盾:死锁。
死锁的产生:同步嵌套同步。
package com.itheima.test7;
class Test implements Runnable{
private boolean flag;
Test(boolean flag){
this.flag=flag;
}
public void run(){
if(flag){
synchronized (MyLock.locka) {
System.out.println("iflocka");
synchronized (MyLock.lockb) {
System.out.println("if lockb");
}
}
}
else{
synchronized (MyLock.lockb) {
System.out.println("else lockb");
synchronized (MyLock.locka) {
System.out.println("else locka");
}
}
}
}
}
class MyLock{
static Objectlocka=new Object();
static Objectlockb=new Object();
}
public class DeadLockTest {
public static void main(String[] args) {
Thread t1=new Thread(new Test(true));
Thread t2=new Thread(new Test(false));
t1.start();
t2.start();
}
}
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- php 上传文件到ftp上
- CodeProject上的一些摘抄
- Ubuntu中Git服务器搭建(做了修改)
- .NET中的Task
- google play v2支付修改 android:targetSdkVersion 这个大于11出现异常问题
- 黑马程序员_多线程
- HQL的多表查询 left jon 等 (需要配置一对多)
- 序列化和反序列化
- android 图库缓存问题
- 在安装flash player 时提示不是最新的版本 && 安装失败
- 黑马程序员_多线程通信
- android虚拟机emulator应用安装--使用adb install安装步骤和注意事项
- 常见嵌入式WEB服务器
- 寒假的ACM训练(一)