您的位置:首页 > 职场人生

黑马程序员_java 多线程(1)

2013-06-12 12:00 134 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! 
----------------------

1.概述

进程:是一个正在执行的程序,每一个进程的执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元。

线程:就是进程中的一个独立的控制单元;线程在控制着进程的执行,一个进程至少有一个线程。

java启动是就会有一个进程java.exe执行,该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存放于main方法中。

2.创建线程的方式

    方式一:(1)定义类继承Thread;

           (2)覆盖Thread中的run方法,目的是将自定义的代码存储在run方法中,让线程运行。

           (3)调用线程的strat方法;该方法的作用:启动线程,调用run方法。

               public
class
Test {
                  publicstatic
void
main(String[]args) {
                     Demo demo=new Demo();//创建一个线程
                     demo.start();//开启线程并执行线程的run方法
                  }
}
class Demo
extends
Thread
{
    public
void
run()
    {
      
    }
}
    调用start方法而不调用run方法:调用run方法仅仅是对象调用方法,而线程创建了去并没有运行。
    方式二:(1)定义类实现Runnable接口;
           (2)覆盖Runnable接口中的run方法;目的:存储线程要运行的代码
           (3)通过Thread类建立线程对象;
           (4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数;
因为自定义的run方法所属的对象是Runnable接口的子类对象,所以让要让多线程去执行指定对象的run方法;
           (5)调用Thread类的start方法开启线程。
              public
class
Test {
                  publicstatic
void
main(String[]args) {
                     Demo demo=new Demo();
                     Thread th=new Thread(demo);//创建线程
                     Thread th1=new Thread(demo);//创建线程
                     th.start();
                     th1.start();
                  }
}
class Demo
implements
Runnable
{
                  publicvoid run()
                  {
      
                  }
}
    创建线程两种方式的利弊:
       实现的好处:避免了单继承的局限性
       区别:
           继承Thread:线程代码存放在Thread子类的run方法中
           实现Runnable:线程的代码存放在接口子类的run方法中
3.多线程的特性:随机性
多线程运行后结果会不同,因为在某一时刻cpu只能执行一个程序。所以多个线程执行时,这些线程都会获取cpu的执行权,cpu执行到谁,谁就会运行。

4.多线程的运行状态  
        


5.获取多线程对象及名称
    线程都有自己默认的名称 Thread-编号 该编号是从0开始的
    static Thread CurrentThread(): 获取当前线程兑现 
    getName(): 获取线程名称
6.多线程的安全问题
问题的原因:当多条语句在操作同一个线程的共享数据时,一个线程对多条语句只执行了一部分,还没执行完,另
           一个线程参与进来,导致共享数据的错误。
    解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可参与执行
    解决方式一:同步代码块
           synchronized(对象)
           {
              需要被同步的代码(明确多线程运行代码;明确共享数据;明确哪些语句是操作共享数据的)
}
同步的经典举例-----火车卫生间
    解释:对象如同锁,持有锁的对象才能在同步中执行,没有锁定的对象即使有获取执行权,也不能在同步中执行
    同步的前提:1.必须要有两个或者两个以上的线程 2.必须是多个线程使用同一个锁
    同步的利弊:
           利:解决了多线程的安全问题
           弊:多个线程需要判断锁,较为消耗资源。
    方式二:同步函数
       函数需要被对象调用,那么函数都有一个所属对象引用this,所以同步函数使用的锁是this。
class Demo
{
    public
synchronized void
method()
    {
       //操作共享数据的语句
    }
}
       静态同步函数:静态同步函数的锁是:类名.class、
因为静态方法中不能定义this,但是静态进内存时,内存中没有本类对象,但一定有该类对应的字节码文件对象,该对象的类型是Class。所以静态的同步方法,使用的锁是该方法所在类的字节码文件对象即:类
99d1
名.class

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! 

----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: