您的位置:首页 > 其它

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

2017-06-21 09:20 302 查看

多线程:

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

进程:正在执行中的程序(直译)

线程:就是进程中用来控制程序执行的控制单元(执行路径)

一个进程可以多个执行路径,称之为多线程。

一个进程至少要有一个线程。

开启多个线程是为了同时运行多部分代码。

每一个线程都有自己要执行的内容,这部分内容可以称为线程要执行的任务。

多线程的好处:解决了多部分同时运行的问题。

多线程的弊端:线程太多会导致效率的降低。

其实应用程序的执行都是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单继承的局限性。

所以,创建线程的第二种方式较为常用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: