java实现多线程的方法

一、实现方法

1、继承Thread类

2、实现Runnable接口

(一)继承Thread类

对于直接继承Thread的类来说,代码大致框架是:

class 类名 extends Thread{
方法1;
方法2;
…
public void run(){
// other code…
}
属性1;
属性2;
…

}

先看一个错误的例子:

 1 /**
 2  * 继承Thread类,直接调用run方法
 3  */
 4 class hello extends Thread {
 5     private String name;
 6
 7     public hello() {
 8     }
 9
10     public hello(String name) {
11         this.name = name;
12     }
13
14     public void run() {
15         for (int i = 0; i < 5; i++) {
16             System.out.println(name + "运行     " + i);
17         }
18     }
19
20     public static void main(String[] args) {
21         hello h1 = new hello("A");
22         hello h2 = new hello("B");
23         h1.run();
24         h2.run();
25     }
26 }

我们会发现这些都是顺序执行的,说明我们的调用方法不对,应该调用的是start()方法。

将main函数改为以下代码

public static void main(String[] args) {
        hello h1 = new hello("A");
        hello h2 = new hello("B");
        h1.start();
        h2.start();
    }

运行的结果可能为:

A运行 0
B运行 0
A运行 1
B运行 1
A运行 2
B运行 2
A运行 3
A运行 4
B运行 3
B运行 4

因为需要用到CPU的资源,所以每次的运行结果基本是都不一样的。

注意:虽然我们在这里调用的是start()方法,但是实际上调用的还是run()方法的主体。

那么:为什么我们不能直接调用run()方法呢?

我的理解是:线程的运行需要本地操作系统的支持。

(二)实现Runnable接口

代码大致框架如下:

class 类名 implements Runnable{
方法1;
方法2;
…
public void run(){
// other code…
}
属性1;
属性2;
…

}

先看个例子(注意和继承Thread ,main函数的不同):

 1 /**
 2  * 调用Runnable方法
 3  */
 4 class hello implements Runnable {
 5     private String name;
 6
 7     public hello() {
 8     }
 9
10     public hello(String name) {
11         this.name = name;
12     }
13
14     public void run() {
15         for (int i = 0; i < 5; i++) {
16             System.out.println(name + "运行     " + i);
17         }
18     }
19
20     public static void main(String[] args) {
21         hello h1 = new hello("A");
22         Thread t1 = new Thread(h1);
23         hello h2 = new hello("B");
24         Thread t2 = new Thread(h2);
25         t1.start();
26         t2.start();
27     }
28 }

可能的运行结果为:

A运行 0
B运行 0
B运行 1
B运行 2
B运行 3
B运行 4
A运行 1
A运行 2
A运行 3
A运行 4

Thread和Runnable的区别:

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

总结一下:

实现Runnable接口比继承Thread类所具有的优势:

1)适合多个相同的程序代码的线程去处理同一个资源

2)可以避免java中的单继承的限制

3)增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

所以,本人建议大家尽量实现接口。

时间: 2024-11-07 19:20:27

java实现多线程的方法的相关文章

Java的多线程创建方法

1. 直接使用Thread来创建 package com.test.tt; public class ThreadEx extends Thread{ private int j; public void run(){ for(j=0; j<100;j++){ System.out.println("当前的线程名称是:"+ getName() + " " + "当前j的值是:" + j); } } public static void ma

java多线程创建方法

1.继承Thread类 2.实现Runnable接口 3.两种实现方法之间的关系 4.实例 sleep是属于Thread类的静态函数. /** * aThread.java * @author cjc */ public class aThread extends Thread { public void run() { for(int i=0;i<10;i++) { System.out.println("The son thread1 is running..."); try

java创建多线程方法之间的区别

我们知道java中创建多线程有两种方法(详见http://blog.csdn.net/cjc211322/article/details/24999163).那么两者有什么区别呢? 一.情形一 code1 /** * ThreadTestDemo.java * @author cjc * */ public class ThreadTestDemo { public static void main(String[] args) { Ticket t=new Ticket(); t.start(

Java并发编程(一) 两种实现多线程的方法(Thread,Runnable)

Java中实现多线程的方法有两种: 继承Thread类和实现Runnable方法,并重写Run方法,然后调用start()方法启动线程.使用Runnable会比Thread要好很多,主要是以下三个原因: (1)Java语言是单继承的,如果继承了Thread类,那么便无法继承其他类. (2)适合多个相同程序代码的线程区处理同一资源的情况. 测试(Thread类) package com.csdhsm.concurrent; /** * @Title: ThreadDemo.java * @Pack

2017第45周一java多线程创建方法

1. 从JDK1.5开始,Java提供了3种方式来创建,启动多线程: Ø 继承Thread类来创建线程类,重写run()方法作为线程执行体. Ø 实现Runnable接口来创建线程类,重写run()方法作为线程执行体. Ø 实现Callable接口来创建线程类,重写run()方法作为线程执行体. 其中第一种方式效果最差,它有2点坏处: l 线程类继承了Thread类,无法在继承其他父类. l 因为每条线程都是一个Thread子类的实例,因此多个线程之间共享数据比较麻烦. 对于第二三种方式,它们的

java中多线程执行时,为何调用的是start()方法而不是run()方法

Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状态(可运行状态),此时并没有运行,一旦得到CPU时间片,就自动开始执行run()方法.此时不需要等待run()方法执行完也可以继续执行下面的代码,所以也由此看出run()方法并没有实现多线程. 2,run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的.如果直接调用run(),其实就相当

java实现多线程的三种方式

java中实现多线程的方法有两种:继承Thread类和实现runnable接口 1.继承Thread类,重写父类run()方法   public class thread1 extends Thread {           public void run() {                 for (int i = 0; i < 10000; i++) {                         System.out.println("我是线程"+this.get

详解三种java实现多线程的方式

java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class thread1 extends Thread {    public void run() {        for (int i = 0; i < 10000; i++) {            System.out.println("我是线程"+

Java基础--多线程的方方面面

1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 6,线程的优化有哪些方法? 1,什么是线程?线程和进程的区别是什么? 线程是程序执行的最小单元. 区别: 进程是操作系统进行资源处理和分配的最小单位,而一个进程可以包含多个线程,并共享进程的资源. 2,什么是多线程?为什么设计多线程? 介绍之前,我们需要理解并行和并发的定义: 并行:同一个时刻有多