java线程的两种创建方式及比较
2017-06-30 14:51
253 查看
一、线程的概念:
线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行。当程序作为一个应用程序运行时,java解释器为main()方法启动一个线程。
二、并行与并发:(1)并发:在单处理器系统中,多个线程共享CPU时间,而操作系统负责调度及分配资源给它们,同一时间只能运行一个线程。(2)并行:在多处理器系统中,多个处理器可以同时运行多个线程,这些线程在同一时间可以同时运行。
三、线程的创建:1)基础概念: java中每个任务就是一个可运行对象,为了创建任务,必须首先定义任务类,任务类必须实现Runnable接口。而线程本质上讲就是便于任务执行的对象。一个线程的执行过程就是一个任务类中run()方法的执行到结束。2)方式1:通过Runnable接口创建线程 a.定义一个任务类实现Runnable接口,实现Runnable接口中的run()方法(run()方法告知系统线程该如何运行),run()方法中定义具体的任务代码或处理逻辑。 b.定义了任务类后,为任务类创建一个任务对象。 c.任务必须在线程中执行,创建一个Tread类的对象,将前面创建的实现了Runnable接口的任务类对象作为参数传递给Tread类的构造方法。 d.调用Tread类对象的start()方法,启动一个线程。它会导致任务的run()方法被执行,当run()方法执行完毕,则线程就终止。 实例代码:package com.muzeet.mutithread;
//每个任务都是Runable接口的一个实例,任务是可运行对象,线程是便于任务执行的对象。必须创建任务类,重写run方法定义任务
public class ThreadDemo1 implements Runnable {
private int countDown = 10;
@Override
//重写run方法,定义任务
public void run() {
while(countDown-- >0)
{
System.out.println("$" + Thread.currentThread().getName()
+ "(" + countDown + ")");
}
}
//调用start方法会启动一个线程,导致任务中的run方法被调用,run方法执行完毕则线程终止
public static void main(String[] args) {
Runnable demo1 = new ThreadDemo1();
Thread thread1 = new Thread(demo1);
Thread thread2 = new Thread(demo1);
thread1.start();
thread2.start();
System.out.println("火箭发射倒计时:");
}
}
程序运行结果:
同时运行两个任务对象:
public static void main(String[] args) {
Runnable demo1 = new ThreadDemo1();
Runnable demo2 = new ThreadDemo1();
Thread thread1 = new Thread(demo1);
Thread thread2 = new Thread(demo2);
thread1.start();
thread2.start();
System.out.println("火箭发射倒计时:");
}
运行结果:
3)方式2:继承Thread类来创建线程
a.首先创建一个任务类extends Thread类,因为Thread类实现了Runnable接口,所以自定义的任务类也实现了Runnable接口,重新run()方法,其中定义具体的任务代码或处理逻辑。 b.创建一个任务类对象,可以用Thread或者Runnable作为自定义的变量类型。 c.调用自定义对象的start()方法,启动一个线程。 示例代码:package com.muzeet.mutithread;
//每个任务都是Runable接口的一个实例,任务是可运行对象,线程即可运行对象。必须创建任务类,重写run方法定义任务
public class ExtendFromThread extends Thread {
private int countDown = 10;
@Override
//重写run方法,定义任务
public void run() {
while(countDown-- >0)
{
System.out.println("$" + this.getName()
+ "(" + countDown + ")");
}
}
//调用start方法会启动一个线程,导致任务中的run方法被调用,run方法执行完毕则线程终止
public static void main(String[] args) {
ExtendFromThread thread1 = new ExtendFromThread();
ExtendFromThread thread2 = new ExtendFromThread();
thread1.start();
thread2.start();
System.out.println("火箭发射倒计时:");
}
}
运行结果:
4)对比采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行。当程序作为一个应用程序运行时,java解释器为main()方法启动一个线程。
二、并行与并发:(1)并发:在单处理器系统中,多个线程共享CPU时间,而操作系统负责调度及分配资源给它们,同一时间只能运行一个线程。(2)并行:在多处理器系统中,多个处理器可以同时运行多个线程,这些线程在同一时间可以同时运行。
三、线程的创建:1)基础概念: java中每个任务就是一个可运行对象,为了创建任务,必须首先定义任务类,任务类必须实现Runnable接口。而线程本质上讲就是便于任务执行的对象。一个线程的执行过程就是一个任务类中run()方法的执行到结束。2)方式1:通过Runnable接口创建线程 a.定义一个任务类实现Runnable接口,实现Runnable接口中的run()方法(run()方法告知系统线程该如何运行),run()方法中定义具体的任务代码或处理逻辑。 b.定义了任务类后,为任务类创建一个任务对象。 c.任务必须在线程中执行,创建一个Tread类的对象,将前面创建的实现了Runnable接口的任务类对象作为参数传递给Tread类的构造方法。 d.调用Tread类对象的start()方法,启动一个线程。它会导致任务的run()方法被执行,当run()方法执行完毕,则线程就终止。 实例代码:package com.muzeet.mutithread;
//每个任务都是Runable接口的一个实例,任务是可运行对象,线程是便于任务执行的对象。必须创建任务类,重写run方法定义任务
public class ThreadDemo1 implements Runnable {
private int countDown = 10;
@Override
//重写run方法,定义任务
public void run() {
while(countDown-- >0)
{
System.out.println("$" + Thread.currentThread().getName()
+ "(" + countDown + ")");
}
}
//调用start方法会启动一个线程,导致任务中的run方法被调用,run方法执行完毕则线程终止
public static void main(String[] args) {
Runnable demo1 = new ThreadDemo1();
Thread thread1 = new Thread(demo1);
Thread thread2 = new Thread(demo1);
thread1.start();
thread2.start();
System.out.println("火箭发射倒计时:");
}
}
程序运行结果:
public static void main(String[] args) {
Runnable demo1 = new ThreadDemo1();
Runnable demo2 = new ThreadDemo1();
Thread thread1 = new Thread(demo1);
Thread thread2 = new Thread(demo2);
thread1.start();
thread2.start();
System.out.println("火箭发射倒计时:");
}
运行结果:
a.首先创建一个任务类extends Thread类,因为Thread类实现了Runnable接口,所以自定义的任务类也实现了Runnable接口,重新run()方法,其中定义具体的任务代码或处理逻辑。 b.创建一个任务类对象,可以用Thread或者Runnable作为自定义的变量类型。 c.调用自定义对象的start()方法,启动一个线程。 示例代码:package com.muzeet.mutithread;
//每个任务都是Runable接口的一个实例,任务是可运行对象,线程即可运行对象。必须创建任务类,重写run方法定义任务
public class ExtendFromThread extends Thread {
private int countDown = 10;
@Override
//重写run方法,定义任务
public void run() {
while(countDown-- >0)
{
System.out.println("$" + this.getName()
+ "(" + countDown + ")");
}
}
//调用start方法会启动一个线程,导致任务中的run方法被调用,run方法执行完毕则线程终止
public static void main(String[] args) {
ExtendFromThread thread1 = new ExtendFromThread();
ExtendFromThread thread2 = new ExtendFromThread();
thread1.start();
thread2.start();
System.out.println("火箭发射倒计时:");
}
}
运行结果:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
相关文章推荐
- Java多线程总结(一):Java两种创建线程方式的比较
- java多线程总结一:线程的两种创建方式及优劣比较
- 创建线程两种方式比较
- 利用反射机制创建新类的两种方式及比较
- Java中两种String对象创建和初始化方式比较
- java多线程总结一: 线程的两种创建方式及优劣比较
- Java中两种String对象创建和初始化方式比较
- java多线程总结一:线程的两种创建方式及优劣比较
- Java【多线程知识总结(5)】比较继承Thread类创建线程和实现Runnable接口创建线程这两种方式
- UIImageView的两种创建方式的比较
- java多线程总结一:线程的两种创建方式及优劣比较
- 两种OpenXML创建Excel单元格的方式比较
- java多线程总结一: 线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较
- 创建线程两种方式的比较
- Java线程创建的两种方式
- java多线程总结一:线程的两种创建方式及比较
- Java【多线程知识总结(5)】比较继承Thread类创建线程和实现Runnable接口创建线程这两种方式
- Java线程的两种创建方式及优劣比较
- java多线程总结一:线程的两种创建方式及优劣比较