您的位置:首页 > 编程语言 > Java开发

菜鸟java学习第五篇 线程

2016-07-23 20:37 561 查看
进程:是一个正在执行中的程序,每一个程序开启都会在内存中分配一片空间,进程就是用来标识这片空间的。

线程:进程中的一个独立的控制单元(执行路径),线程在控制着进程的执行也就是说真正执行的是进程中的线程

多线程:一个进程中有多个线程在同时进行

多线程存在的意义:可以使多部分代码同时执行,提高执行效率

 

多线程的特点:随机性

 

Thread类中几个方法:

currentThread();//静态方法,返回是当前正在执行的线程对象

getName();//获取线程的名称

setName();//定义线程的名称  也可在构造方法中传入线程名称

创建线程的方式:

第一种:步骤:1.自定义类继承Thread类。

                            2.复写Thread类中的run方法

                                     为了将自定义线程需要运行的代码存储进run方法,也就是说run方法中定义的是自定义线程的执行代码

                            3.调用线程的start方法,开启线程。

                   Start方法的两个作用:一启动了线程  二调用run方法

Start方法会新建一个线程去执行这个代码

第二各:步骤:1.自定义类去实现Runnable接口

                            2.实现Runnable接口中的run方法

                            3.通过Thread类创建线程对象

                            4.将创建的Runnable接口的子类对象作为参数传递给Thread类的构造函数

                                            因为需要线程去运行run方法中的代码

               5.通过start方法开启线程。

 

第二种的好处:避免了单继承的局限性

多线程存在安全隐患

不安全的原因:当多条语句在操作同一个共享数据时,如果一个线程对多语句只执行了一部分还没有执行完,另一个线程参与进行执行,导致了共享数据的错乱

如何解决安全问题?

      同步代码块:格式

                                               synchronized(对象) {        //同步代码块

                                                         需要被同步的代码

                                               }

同步的前提:1.有两个或两个以上的线程在操作相同的代码

2.必须多个线程使用的是同一个锁。

 

同步的好处:解决了多线程的安全问题

弊端:线程需要判断,较为消耗资源

查找需要同步的代码块

(需要被多线程执行   操作了共享数据   哪些语句在操作这个共享数据)

 

同步的两种表现形式:1.同步代码块 2.同步函数 在方法定义时加上synchronized关键字

同步函数的锁是this 也就是它的对象

函数为static时   对象就不是 this

静态同步函数的锁是本类字节码对象,也就是类名.class

 线程的五种状态:

 

 

  
 

同步可能会出现死锁

死锁一般会出现在同步互相嵌套的情况下,而且所持有的锁不同造成的

 

线程间的通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。

 

JDK5.0对多线程进行了升级:将同步synchronized替换成显式的lock操作,将object中的wait,notify,notifyAll替换成了Condition对象(该对象可以用lock中的newCondition方法进行获取)

 

升级之后好处:一个锁可以绑定多个condition对象

Interrupt方法:让处于冻结状态的线程强制恢复到运行状态,但是会发生interruptedException异常

守护线程:当程序中都是守护线程时,JVM会退出

用    线程名.setDaemon(true);将该线程设置为守护线程。

注意:必须在线程开启前调用

 
 

 join方法  :等待线程结束,在哪个线程中调用另一个线程的join方法,则该线程需要在另一个线程执行完毕后再执行

 


yield()方法暂停当前正在执行的线程对象,并执行其他线程

 

线程最重要的是匿名内部类使用  例子在ThreadTest4.java

package thread;
//ThreadTest4.java
public class ThreadTest4 {
public static void main(String[] args) {
new Thread() {<span style="white-space:pre">		</span>//创建匿名内部类
@Override
public void run() {<span style="white-space:pre">		</span>//重写Thread类的run()方法
for (int i = 0; i < 50; i++) {
System.out.println("bbb" + i);
}
super.run();
}
}.start();
for (int i = 0; i < 50; i++) {
System.out.println("aaa" + i);
}
Runnable runnable=new Runnable() {

@Override
public void run() { <span style="font-family: Arial, Helvetica, sans-serif;">//重写Thread类的run()方法</span>

for (int i = 0; i < 50; i++) {
System.out.println("ccc" + i);
}
}
};
new Thread(runnable).start();<span style="white-space:pre">	</span>//开启线程
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程 线程