多线程的实现方案(掌握) 
                A:继承Thread类 
                        1,自定义MyThread继承Thread类, 
                        2,MyThread类里面重写run()方法, 
                                public class MyThread extends Thread{ 
                                        public void run(){ 
                                                for(int x=0;x<100;x++){ 
                                                        System.out.println(x); 
                                                } 
                                        } 
                                } 
                        3,创建对象。 
                        4,启动线程。 
                                public static void main(String[] args){ 
                                        //创建线程对象 
                                        MyThread my1=new MyThread(); 
                                        MyThread my2=new MyThread(); 
                                        //调用方法设置名称 
                                        my1.setName("线程一"); 
                                        my2.setName("线程二"); 
                                        //启动线程 
                                        my1.start(); 
                                        my2.start(); 
                                         
                                } 
                                 
                        面试题:run()和start()的区别? 
                        run():仅仅是封装被线程执行的代码,直接调用run()方法就是普通方法了。 
                        start();首先启动线程,然后再有jvm去调用该线程的run()方法 
                B:实现Runnable接口 
        总结:实现多线程的两种方式 
                方式一:继承Thread类 
                        A:自定义MyThread继承Thread类。 
                        B:在MyTHread类中重写run()方法。 
                        C:创建MyThread类的对象。 
                        D:启动线程对象。 
                方式二:实现Runable接口 
                        A:自定义类MyRunnable实现Runnable接口 
                        B:在MyRunnable里面重写run() 
                        C:创建MyRunnable类的对象 
                        D:创建Thread类的对象,并把C步骤的对象作为构造参数传递,启动线程。 
                代码对比 
                方式一 
                MyThread my1=new MyThread(); 
                MyThread my2=new MyThread(); 
                my1.setName("线程一"); 
                my2.setName("线程二"); 
                my1.start(); 
                my2.start(); 
                方式二 
                MyRunnable mr1=new MyRunnable(); 
                MyRunnable mr2=new MyRunnable(); 
                Thread t1=new Thread(my1,"线程一") 
                Thread t2=new Thread(my2,"线程二") 
                t1.start(); 
                t2.start(); 
                问题:a,为什么要重写run方法?                run里面封装的是要被线程执行的代码。 
                        b,启动线程对象用的是那个方法?          start()。 
                        c,run和start方法的区别?             run直接调用仅仅是普通方法,start会先启动线程,再有jvm调用run方法。 
                        d,有了方式一问什么还要有方式二呢? 
                                1,实现Runable接口可以避免由于java单继承带来的局限性。 
                                2,适合多个相同程序的代码去处理同一个资源的情况,把线程同程序代码数据有效分离,降低了耦合性,较好的体现了面向对象的设计思想。 
 
 |   
        
 
    
    
    
     
 
 |