A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xss222 中级黑马   /  2016-12-10 00:05  /  1145 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、多线程1、概述
在一个进程中有多条执行路径。
A进程 正在执行的程序,它代表着应用程序的执行区域。
B线程 进程的执行路径.就是进程中一个负责程序执行的控制单元。
线程总是属于某个进程,进程中的多个线程共享进程的内存。
2、关于多线程的相关问题
u  jvm的启动是多线程的还是单线程的,为什么?
多线程的,它至少启动了两个线程(主线程和垃圾回收线程),垃圾回收机制这个线程不可能是在程序执行完毕后才启动的,否则的话,我们的程序很容易出现内存溢出。
u  调用start方法和run方法区别?
调用start方法后,线程进入就绪状态,此时线程对象仅有执行资格,还没有执行权。当该线程对象抢到了执行权时,方可调用run方法,当run方法执行完毕后,线程死亡,不能复生。
u  线程的随机性的导致的原因?
在同一时刻,CPU只能执行一个程序,这个多线程的程序其实是CPU的高速切换造成的。
u  什么时候使用多线程?以及创建线程的目的?
多线程的引入是为了解决现实生活中的需求的,提高解决问题的效率。比如购买火车票这个动作。当许多对象要对同一有限资源进行操作的时候,我们就要使用多线程。
u  线程状态的内容和每一个状态的特点?
创建线程对象后,并对这个对象进行了一些初始化工作,当调用了start方法后,这个状态就有了执行资格,但是此时还未获得执行权,进入到了就绪状态。当抢到执行权后进入了运行状态,此时该线程既有了执行资格,又有了执行权,当调用了run方法后,此线程进入了死亡状态。当然你也可以调用stop方法令其强制死亡。在运行状态的时候,如果该线程调用了sleep或者wait等方法后,他会进入到阻塞状态,此时,这个对象释放了执行资格和执行权,当他的sleep或者wait时间结束后,亦或者调用了notify(notifyAll)方法,该线程被唤醒,又进入了就绪状态。如此周而复始。
3、创建线程的方式
A继承Thread
**步骤
                  a:定义一个类继承Thread类;
                  b:重写Thread类中的run()方法,run()方法里边是多线程要运行的代码;
                  c:创建定义的那个类的对象;
                  d:调用start()方法开启线程,执行run()方法里的内容。
另外可以通过Thread的getName()获取线程的名称。
public class ThreadDemo extends Thread{
    public void run(){
        for(int x=0;x<10;x++){
            System.out.println("线程"+getName()+"正在运行:"+x);
        }
    }
    public static void main(String[] args) {
        ThreadDemo t1 = newThreadDemo();
        ThreadDemo t2 = newThreadDemo();
        t1.start();
        t2.start();
    }
}
         **线程的生命周期  创建-----阻塞------运行------死亡
B实现Runnable接口
         **步骤     
                  a:定义一个类实现Runnable接口;
                  b:重写Runnable接口中的run()方法,run()方法里是多线程要运行的代码;
                  c:创建定义的那个类的对象,并将其作为参数放置于Thread类的对象里。线程的   任务都封装在Runnable接口子类对象的run方法中。所以要在线程对象创建时就必须         明确要运行的任务
                  d:调用start()方法启动线程,执行run()方法里的内容。
public class RunnableDemoimplements Runnable {
    public void run() {
        for(int x = 0;x<10;x++){
             System.out.println(Thread.currentThread().getName()+" "+x);
        }
    }
    public static void main(String[] args) {
        RunnableDemo rd = newRunnableDemo();
        Thread t1 = new Thread(rd);
        Thread t2 = new Thread(rd);
        t1.start();
        t2.start();
    }
}
总结:两种方法的比较:实现Runnable接口,将线程的任务从线程的子类中分离出来的,进行了单独的封装,按照面向对象的思想将任务的封装成对象,避免了java中单继承的局限性。(创建线程第二种方式较好)static变量的生命周期过长。
u  对创建线程的第二种方式的设计的理解?
创建多线程的第二种方式是实现Runnable接口,并实现run()方法。由于第一种方式有资源不能共享的缺点,它需要创建很多的线程对象,而这些线程对象对同一资源又是独有的,如果设定为共享资源(设为静态),必将消耗太多内存资源,静态变量的生命周期过长。此外,如果一个线程对象类继承了其他类,此时他无法继承Thread类,也就不能使用第一种方式来创建线程。


1 个回复

倒序浏览
有用!!!!!O(∩_∩)O谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马