黑马程序员技术交流社区

标题: 【黑马程序员杭州】浅谈java多线程 [打印本页]

作者: 小江哥    时间: 2018-1-12 16:30
标题: 【黑马程序员杭州】浅谈java多线程
本帖最后由 小江哥 于 2018-1-12 16:38 编辑

一、进程和线程的基础知识
1、进程和线程的概念
进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)
线程:进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源)
在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。                                                                    
区别:
1、是否占有资源问题
2、创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大。
3、进程为重量级组件,线程为轻量级组件

多进程: 在操作系统中能同时运行多个任务(程序)
多线程: 在同一应用程序中有多个功能流同时执行

2、线程的主要特点
①、不能以一个文件名的方式独立存在在磁盘中;
②、不能单独执行,只有在进程启动后才可启动;
③、线程可以共享进程相同的内存(代码与数据)。

3、多线程(多个线程同时运行)程序的主要优点
①、可以减轻系统性能方面的瓶颈,因为可以并行操作;
②、提高效率;
二、线程的创建和启动
其实看看API,从Thread的构造方法,就可以看出创建一个线程的方式:
  
Thread()
            
分配新的 Thread 对象。
  
Thread(Runnable target)
            
分配新的 Thread 对象。
Thread(Runnable target,String name)
            
分配新的 Thread 对象。
Thread(String name)
            
分配新的 Thread 对象。
Thread(ThreadGroup group,Runnable target)
            
分配新的 Thread 对象。
Thread(ThreadGroup group,Runnable target,String name)
            
分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。
Thread(ThreadGroup group,Runnable target,String name,  long stackSize)
            
分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小
Thread(ThreadGroup group,String name)
            
分配新的 Thread 对象。

java中创建一个线程有两种方式:
1、继承Thread类,重写run()方法,然后直接new这个对象的实例,创建一个线程的实例。然后调用start()方法启动线程
2、实现Runnable接口,重写run()方法,然后调用new Thread(runnable)的方式创建一个线程,然后调用start()方法启动线程
其实看Thread的源文件,发现它也是实现了Runnable接口的。
1、继承Thread类的方式
[Java] 纯文本查看 复制代码
        public class Test1 {  
            public static void main(String[] args) {  
                System.out.println(Thread.currentThread().getName());  
                MyThread myThread=new MyThread();  
                myThread.start();  
            }  
        }  
        class MyThread extends Thread{  
            int i=0;  
            @Override  
            public void run() {  
                while (i<10) {  
                    System.out.println(this.getName()+"    i的值   "+i);  
            i++;  
        }  
2、实现Runnable接口
[Java] 纯文本查看 复制代码
        public class Test1 {  
    public static void main(String[] args) {  
                System.out.println(Thread.currentThread().getName());  
                Thread thread=new Thread(new MyRunnable());  
                thread.start();  
            }  
        }  
        class MyRunnable implements Runnable{  
            int i=0;  
            @Override  
            public void run() {  
                while (i<10) {  
                    System.out.println(Thread.currentThread().getName()+"    i的值   "+i);  
                    i++;  
                }  
            }  
        }  


注意:
①、在继承Thread的方式中,可以使用getName()方法,来获得当前线程的名字,这是因为在Thread类中,有这个方法。可是在实现Runnable方式中,却不可以使用this.getName(),因为Runnable接口没有这个方法(可以看出来,因为我们没有提示我们需要重写这个方法),所以只能通过Thread的静态方法Thread.currentThread()取得当前的Thread对象,在调用getName()方法,来取得当前线程的名字。
②、对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。只有调用start()方法才会启动新线程。
3、两种方式的对比
采用实现Runnable接口方式的多线程具有优势,一般都会使用这种方式:
1、线程类只是实现了Runnable接口,还可以继承其他类。
2、在这种方式下,可以多个线程共享一个Runnable target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。
总结:继承Thread和实现Runnable的区别
1.     继承Thread没法做到数据共享(可以在成员变量加static 实现)
2.     继承Thread的锁要用对象.class字节码文件不能用this
本质:继承Thread类在开启线程时候会创建多个对象,而实现Runnable则会共享一个对象
通过今天的学习,想必大家对java多线程有了更深刻的了解,我们下次再见。

校区捷报

众览群雄,唯我杭城独秀—一贴汇总杭州校区所有就业薪资
http://bbs.itheima.com/thread-345570-1-1.html


作者: Yin灬Yan    时间: 2018-1-12 18:35
我来占层楼啊   




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2