进程 和 线程

进程:就是正在运行的程序,分配内存让应用程序能够运行

Windows  系统号称多任务(可以同时运行多个任务)

从宏观上看:windows确实是允许了多个程序运行

微观上看:cup快速做了切换执行任务,由于速度特别快,我们人感觉不到这个切换的过程

线程:线程在一个进程中负责代码的执行,就是一个进程中的执行路径

Java程序运行的时候,jvm会帮我们创建一个主线程来执行代码。主线程也主要负责main方法中的代码执行

一个java程序中至少有2个线程

一个是主线程,只要负责main方法中的代码的执行,一个是垃圾回收器线程,负责垃圾回收

 

多线程:在一个进程中多个线程同时执行不同的任务。  “同时“:单核cpu快速切换多个线程执行任务,速度特别快,感觉不到切换

 

多线程的好处:

1.解决一个进程中同时执行多个任务的问题

2.提高资源的利用率

 

多线程的弊端:

1.增加cpu 的负担不是线程愈多愈好

2.降低了一个进程中线程的执行概率

3.线程容易引发线程安全问题

4.容易出现死锁现象

 

 

Java 定义两种方法

方式一 Thread (线程类)

 1.需要定义一个类来继承Thread

2.重写thread类中run方法,把自定义线程的任务代码写在run方法中。  每一个线程都有自己的任务代码 ,jvm创建的主线程的任务代码就是main方法,自定义的线程的任务代码就写下run方法中,

自定义的线程就需要来执行run方法中的代码

 

  注意点 :一旦线程开启了,会默认执行线程对象中的run方法, 但是千万不要自己直接调用run方法,如果直接调用了run就和普通方法没有区别。 开启线程 :  继承Tread的子类的对象 . Start();

线程中常用的方法。

 Thread(String name)     初始化线程的名字

 getName()               返回线程的名字

 setName(String name)    设置线程对象名

 sleep()                 线程睡眠指定的毫秒数。

 getPriority()             返回当前线程对象的优先级   默认线程的优先级是5

 setPriority(int newPriority) 设置线程的优先级    虽然设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现

             (最大的优先级是10 ,最小的1 , 默认是5)。

 currentThread()      返回CPU正在执行的线程的对象

 

 

 

java给线程加锁 :

方式一:同步代码块

锁对象可以是任意一个java中的对象

 java中的任意一个对象 都会有一个对象的状态 ,就可以通过对象的状态来作为锁的一个标识符。

 statue = 0 表示锁是关闭   statue = 1 表示锁打开。

 synchronized (锁对象) {    }

  

同步代码的使用注意点:

1.任意一个对象都可以做锁对象

2.如果你在同步代码块中调用了sleep,不会释放锁的对象

3.只有真正存在线程安全的时候才需要使用同步代码块,否则会降低执行效率

4.多线程操作锁对象必须是唯一的 ,否则无效

 

出现线程安全问题的根本原因:

1.存在两个或两个以上的线程,并且线程之间共享着一个资源

2.多个语句操作了共享资源

 

方式二:

同步函数:用关键字synchronized  修饰run函数(方法)

 

同步函数的使用注意点:

1.如果一个非静态的函数 ,同步函数的锁就是调用方法的对象(this 对象),如果是一个静态函数同步函数的锁对象是当前函数所属类的字节码文件(class 对象)

2.同步函数的锁对象是固定的,不能够自己来定

 

推荐使用:同步代码块

原因:1.同步代码块的锁对象可以可以有自己任意指定,同步函数是固定

2.同步代码块可以控制同步的范围,同步函数必须是整个函数的所有代码都被同步

3.同步函数是同步整个函数的代码

 

 

代码同步是可以解决 线程安全问题

但是如果使用不当会到时线程死锁问题

A线程等B线程,B线程又在等A线程   结果两个人就一直等下去了 ,这个时候就造成了线程死锁。

 死锁现象的解决方案  没有方案 ,尽量避免发生。

 

线程定义的第二种方式:

1.自定义一个类实现Runable接口,接口中会提供一个run方法

 2.实现Runable接口中的run方法。将线程中的任务写在run方法中

 3.创建Runable接口的实现类对象。

 4.创建一个Thread对象,并把Runable实现类创建的对象作为参数。

 5.调用Thread对象的start方法来开启线程

 问题 为什么要将Runable接口实现类的对象作为参数传递?

 为了让对象中的run方法能够在线程中的run方法中执行。也就是能够将对象中的run方法最为线程中的任务来执行。

 推荐使用 :第二种方式  实现Runable.

 

 java 是单继承 ,多实现的   由于java是单继承 ,这个就不能过继承Thread对象来实现多线程

推荐使用第二种方式

 

线程的通讯:一个线程完成自己的任务,去通知另外一个线程去完成另外一个任务。

 wait();  等待    如果线程执行了wait方法 ,那么该线程就会处于一个等待状态,等待状态的线程必须要通过其他线程来调用

notify()方法来唤醒。

notify();唤醒   随机唤醒线程池中的一个线程。

notifyAll(); 唤醒所有等待的线程

 

waitnotify的使用注意点 :

1.wait方法和notify方法是属性Object对象

2.wait方法和notify方法必须在同步线程中执行

3.wait方法和notify方法必须有锁对象来调用

 

posted @ 2016-12-13 20:50  紫衣蓝水  阅读(94)  评论(0编辑  收藏  举报