java基础之线程

来源:互联网 发布:淘宝卖家如何打印订单 编辑:程序博客网 时间:2024/05/16 02:27
1.java的面向对象的
         * 1)线程:通过thread对象表示
         * 2)线程任务:通过Runnable对象表示
         *
         *
         * java开启新线程的方式
         * 1)新定义类实现Runnable接口
         * 2)新定义类继承Thread类
         *
         *
         * 新定义类实现Runnable接口方式的步骤
         *
         * 1)新定义任务类实现Runnable接口-重写run方法
         * class 任务类名 implements Runnable{//重写run方法}
         * 2)创建新定义任务类的任务对象
         * new 任务类名()
         * 3)创建线程对象绑定任务对象
         * new Thread(任务对象);
         * 4)开启线程-执行对应的任务
         * 线程对象.start();
         * 注意点:start开启线程,线程不会马上执行。等待分配cpu资源分配之后再继续执行(一般等待的时候比较少)
         *
         *
         * 线程执行的代码
         * main线程:执行的是main方法

         * 新开thread线程:执行的是run方法

2.线程的状态
         *
         * 1)新建:线程对象刚创建出来
         * 2)可运行:线程可以运行了,没有分配到cpu资源
         * 3)运行:线程正在执行代码
         * 4)死亡:线程死掉了,结束了。
         * 5)阻塞:线程暂停执行 了。

3. 线程在执行代码的时候-需要cpu的使用权
         *
         * cpu的使用权-》根据线程的优先级分配的
         *
         * 线程的优先级越高-》分配的机会越多
         *
         * java线程的优先级级别:1(最小)到10(最大)
         *
         * 线程默认优先级-》5
         *
         * 更改线程优先级
         * api:setPriority(int newPriority)
         *
         *
         * 常用的优先级-有对应常量
         *
static int MAX_PRIORITY
          线程可以具有的最高优先级。
static int MIN_PRIORITY
          线程可以具有的最低优先级。
static int NORM_PRIORITY
          分配给线程的默认优先级。
4.线程都是有一个名字的
     *
     * 1)创建线程的时候-可以初始化名字:
     *         Thread(Runnable target, String name)
            Thread(String name)
       2)可以再次更改名字
           setName
       3)获取名字
           getName

5.synchronized关键字概念
         * 保证某一个对象的同步代码(所有的synchronized修饰的代码)在某一个时刻只会被一个线程执行,其他线程只能等待执行完成才可以执行。
         *
         * 对象锁:执行同步代码的时候需要把对象锁住。 1)每个对象都有一个对象锁
         * 2)线程在执行对象synchronized修饰的代码时,会先【自动获取对象锁】,然后把该对象的synchronized修饰的所有代码锁住
         * 3)执行完成synchronized代码后会【自动释放对象锁】,其他线程才可以继续【自动获取对象锁】,
         * 然后其他线程把该对象的synchronized修饰的所有代码锁住。
         *
         * synchronized
         * 关键字:会【自动获取锁和释放锁】,也可以手动获取和释放!java.util.concurrent.locks包提供了丰富的支持。
         *
         *
         * synchronized的使用
         * 1)synchronized块
         * 语法:synchronized(被锁的对象){
         *  //同步执行的代码
         *  }
         *
         * 被锁的对象:多个线程操作的同一个对象
         * 同步执行的代码:多个线程执行的时候,只能一个线程执行,其他线程等待的代码

6.线程安全问题
         *
         * -->线程不安全
         * Stringbuilder,ArrayList,HashMap
         *
         * -->线程安全
         * Stringbuffer,Vector,Hashtable
         *
         *
         * 线程不安全:该类操作对象的代码没有进行同步(synchronized),多个线程操作同一个对象,
         * 可能出现不安全的情况,该对象只能在同一个线程使用才安全。
         *
         * 线程安全:该类操作对象的代码通过(synchronized)进行同步,多个线程操作同一个对象,
         * 有线程使用对象的同步功能,其他线程等待,保证操作安全,该对象可以在多线程使用。

7.死锁描述:  多个线程,都抢占了对方的资源,又都等待对方释放资源。   
死锁原因: 死锁是逻辑问题造成的!
解决办法:让一方先释放资源。
常见死锁:synchronized嵌套加thread.sleep
例子:如两个人分别拿着水和食物,都不放手,又都等待对方释放资源!!形成循环等待

7.线程相关概念

1、程序、进程、线程对比

a)程序:

    Java源程序和字节码文件被称为“程序” (Program),是一个静态的概念------>硬盘上的可执行的文件

b)进程:

    执行中的程序叫做进程(Process),是一个动态的概念。

    - 进程是程序的一次动态执行过程, 占用特定的地址空间.

    - 每个进程由3部分组成(系统分配):cpu,data,code。每个进程都是独立的,保有自己的cpu时间,代码和数据,即便用同一份程序产生好几个进程,它们之间还是拥有自己的这3样东西。  缺点:内存的浪费,cpu的负担

    - 多任务(Multitasking)操作系统将CPU时间动态地划分给每个进程,操作系统同时执行多个进程,每个进程独立运行。以进程的观点来看,它会以为自己独占Cpu的使用权

    - 进程的查看

        - Windows系统: Ctrl+Alt+Del

        - Unix系统: ps or top

c)线程: 

    - 线程是进程中一个“单一的连续控制流程--》代码的执行者”,  (a single sequential flow of control)/执行路径。线程也可以达到同一份程序产生好几个进程的效果,但是不同的线程之间可以有某种程度上的资源共享,所以线程又被称为轻量级进程(lightweight process)。 

    - Threads run at the same time, independently of one another 

    - 一个进程可拥有多个并行的(concurrent)线程

    - 一个进程中的线程共享相同的内存单元/内存地址空间,

可以访问相同的变量和对象,而且它们从同一堆中分配对象的通信、数据交换、同步操作

    - 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。

 

2、进程与程序的区别

      

      程序是一组指令的集合,它是静态的实体,没有执行的含义。而进程是一个动态的实体,有自己的生命周期。

一般说来,一个进程肯定与一个程序相对应,并且只有 一个,但是一个程序可以有多个进程,或者一个进程都没有。

简单地说,进程是程序的一部分,程序运行的时候会产生进程。

 

3、线程进程的概念理解

 

   例如:我们做项目分成几个小组,每个小组做一个项目,每个小组的组员一起合作做一个项目。

这里例子里!

    进程:就是每一个小组,因为他们独立完成各自项目,互相不干扰,比如你们小组的项目

不会交给别的小组乱搞!!!

    线程:就是每一个小组里的各个组员,他们都是做项目人,同一个组的各个人要互相配合

来完成项目,互相影响,使用统一的资源,比如你的代码,别人可以看也可以改!

 

4、并发编程:多个执行运算单元配合完成程序工作

 

    a)多进程开发:进程之间资源独立(cpu和内存)

 

进程之间通信:可以通过后面讲解的socket完成通信!

 

    b)多线程开发:线程之间资源共享(cpu和内存)

 

线程之间通信:可以共享内存(对象)数据完成。

 

   c)多线程多进程对比:

 

进程优点:编程、调试简单,可靠性较高。

进程缺点:创建、销毁、切换速度慢,内存、资源占用大。

线程优点:创建、销毁、切换速度快,内存、资源占用小。

线程缺点:编程、调试复杂,可靠性较差。

 

    d)总结:线程快而进程可靠性高

 

好处:  多个执行单元同时工作,可以使得我们程序的性能提高。

 

例如:

    1)解析5个文件内容并输出。

    2)计算1-500000的累加。