黑马学习笔记4

--------------------android培训java培训、期待与您交流! ------------------

1、什么叫做进程? 什么叫做线程? 线程与进程的区别?

     在操作系统中,每个独立执行的程序称为进程,也就是正在进行的程序。我们现在使用的操作系统一般都是多任务的,即能够同时执行多个应用程序。实际情况是,操作系统负责对CPU等设备的资源进行分配和管理,虽然这些设备某一时刻只做一件事,但以非常小的时间间隔交替执行多个程序,就可以给人以同时执行多个程序的感觉。

    进程是程序的一次动态执行过程,它经历了从代码加载,执行到执行完毕的一个完整过程,这个过程也是进程本身从产生,发展到最终消亡的过程.多进程操作系统能同时运行多个进程(程序),由于cpu具备分时机制,所以每个进程都能循环获得自己的cpu时间片。由于cpu执行速度非常快,使得所有的程序好像在”同时”运行一样。   

    线程是比进程更小的执行单位,线程是在进程的基础之上进行的进一步划分.所谓多线程是指一个进程在执行过程中可以产生多个线程,这些线程可以同时存在, 同时运行,形成多条执行线索,一个进程可能包含了多个同时执行的线程

     每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作。这些线程可以共享进程的状态和资源。

     一个采用了多线程技术的应用程序可以更好地利用系统资源。其主要优势在于充分利用了CPU的空闲时间片,可以用尽可能少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。更为重要的是,由于同一进程的所有线程是共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。

2、线程的创建

     线程的创建方式

        通过java.lang包中的Thread类的描述。
        方式一:继承Thread类
           步骤:(1)定义类继承Thread
                      (2)复写Thread中的run方法,目的是将自定义的代码存储在run方法中,让线程运行。
                      (3)调用线程的start方法,该方法有两个作用:启动线程、调用run方法。
    注意:调用对象的run方法意味着主线程直接从对象中运行方法体。而线程创建了,并没有执行。(super.)start方法才是启动线程,调用(this.)run方法实现多线程。
     发现运行结果每一次都不同。因为多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。明确一点,在某个时刻,只能有一个程序在运行(多核除外)。cpu在做着快速的切换,以达到看上去是同时运行的效果。我门可以形象的把多线程的运行形容为在互相抢夺cpu的执行权。随机性。
      为什么覆盖run方法?
      Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。也就是说Thread类中的run方法,用于存储线程要运行的代码。

多线程的安全问题:

每个线程都会有一个运行的时间片,都会有开始和时间片到期的时候。
所以我们要注意了:一个线程的时间片到期的时候,此线程有可能执行到程序的任何一个位置而被暂停,并没有完全执行完一个原子性的模块,然后就进入时间片的轮换,这样就导致多线程的运行结果不可意料。此时我们就需要对线程进行同步处理。

线程同步关键字是:synchronized

同步代码块:
synchronized(obj) //用于synchronizedobjlock旗标(锁旗标),可以是任何对象,我们通常称之为同步对象或者监视器对象。

需要同步的代码;

}

 

同步方法:只须在方法前加synchronized关键字修饰即可。

同步非静态方法的监视器是this,而同步静态方法的监视器是当前所在的类的Class对象。

只要使用相同的同步对象(监视器)synchronized方法和synchronized代码块也可以实现同步。

那么之前说到的饿汉式单例模式就可以进一步的进行处理:

单例模式-懒汉式举例:

class Stu

{

private int age;

 

private static final Stu null;    //在类本身内部建立一个对象

private Stu()     //把构造函数私有化

{}

public static Stu getStu()   //提供仅供访问

{

If(s==null)

{

Synchronized(Stu.class)

{

If(s==null)

s=new Stu();

}

}

return s;

}

 

public void setAge(int age)

{

this.age age;

}

public int getAge()

{

return age;

}

}

 

在编写多线程同步的时候一定要注意避免死锁的发生。下面是死锁的例子:

class Test implements Runnable

{

private boolean flag;

Test(boolean flag)

{

this.flag flag;

}

public void run()

{

if (flag)

{

 

synchronized(MyLock.locka)

{

System.out.println("if locka");

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 Object locka new Object();

static Object lockb new Object();

}

 

class SiSuoTest 

{

public static void main(String[] args) 

{

Thread t1 new Thread(new Test(true));

Thread t2 new Thread(new Test(false));

t1.start();

t2.start();

}

}

 

--------------------android培训java培训、期待与您交流! ------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值