多线程:初识线程,以及创建线程的两种方式

来源:互联网 发布:2016年韩国迷你网络剧 编辑:程序博客网 时间:2024/04/28 13:06

多线程:

一、进程和线程的定义以及多线程的好处和弊端。

  • 进程:正在执行中的程序(直译)
  • 线程:就是进程中用来控制程序执行的控制单元(执行路径)
  • 一个进程可以多个执行路径,称之为多线程。
  • 一个进程至少要有一个线程。
  • 开启多个线程是为了同时运行多部分代码。
  • 每一个线程都有自己要执行的内容,这部分内容可以称为线程要执行的任务。
  • 多线程的好处:解决了多部分同时运行的问题。
  • 多线程的弊端:线程太多会导致效率的降低。
  • 其实应用程序的执行都是CPU在做着快速的切换完成的,这个切换是随机的。

二、如何创建线程?

方式一:继承Thread类

步骤:

  • 1.定义一个类继承Thread类。
  • 2.覆盖Thread类中的run方法。
  • 3.创建线程对象,直接创建Thread类的子类对象。
  • 4.调用start方法,开启线程,并调用线程的任务run方法执行。

例如:

class Demo extends Thread//继承使用extends关键字{    private String name;    Demo(String name)    {        super(name);//继承中用super表示父类。    }    public void run()//覆盖Thread类中的run方法。    {        show();    }    public void show()//定义线程的任务。    {        for(int i = 0;i<10;i++)        {            for(int j = -999999999;j<999999999;j++){}            System.out.println(name+"..."+i+"name = "+Thread.currentThread().getName());        }    }}public class MultithreadDemo {    public static void main(String[] args) {        Demo d1 = new Demo("旺财");        Demo d2 = new Demo("小强");        //以上两步创建了两个线程对象(线程的子类对象)        d1.start();        d2.start();        //调用线程的start方法。(开启线程)        System.out.println("over name = "+Thread.currentThread().getName());        //Thread.currentThread().getName()可以得到当前运行线程的名称。    }}

调用run和调用start有什么区别

  • Thread类中run()和start()方法的区别如下:
  • run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
  • start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;

方式二:实现Runnable接口。

  • 1.定义类实现Runnable接口
  • 2.覆盖接口中的run方法,将线程的任务代码封装到run方法中
  • 3.通过Thread类创建线程对象,并将Runnable类的子类对象作为构造函数的参数进行传递。
为什么?

因为线程的任务都封装在Runnable接口子类对象的方法中。
所以要在线程对象创建时就明确要运行的任务。
- 4.调用线程对象的start方法开启线程。

例如:

public class ThreadDemo1 {    public static void main(String[] args) {        Demo2 d= new Demo2("小强");         Demo2 d1 = new Demo2("wangcai");        //创建两个线程的任务对象        Thread t1 = new Thread(d,d.name);        Thread t2 = new Thread(d1,d1.name);        //将线程要实现的任务对象作为线程构造函数的参数传给线程。        t1.start();        t2.start();    }}class Demo2 implements Runnable{     String name;    Demo2(String name)    {        this.name = name;    }    public void run()    {        show();    }    public void show()    {        for (int i = 0; i < 10; i++) {            for (int j = 0; j < 9999999; j++) {            }            System.out.println(name+".....i = "+i+"....."+Thread.currentThread().getName());        }    }}

实现Runnable接口的好处!

  • 1.将线程的任务从线程的子类中分离出来,进行了单独的封装,按照面向对象的思想将任务封装成对象。
  • 2.避免了java单继承的局限性。
  • 所以,创建线程的第二种方式较为常用。
原创粉丝点击