java实现多线程有两种方法

    技术2022-05-14  4

    java实现多线程有两种方法 1、继承Thread类 2、实现Runnable接口 

    1)一般认为:实现Runnable接口的对象,其着眼点主要含义是:一个计算任务.它代表一个要被其它线程(如:线程池中的线程)执行的任务.着眼点是:交由其它人去完成的一个计算任务. ---对应着:要做的工作2)一般认为:从Thread类继承的含义主要是:一个能执行其它(或自己)的任务的一个线程对象.着眼点是:线程的功能(通过继承来扩展执行其它计算任务的能力) ---对应着:做工作的工作人员3)当然:若一个类已有父亲,不能再从Thread类继承,只好实现Runnable接口来达到线程的目的,这是一种选择了.

    这两种方法的共同点: 不论用哪种方法,都必须用Thread(如果是Thead子类就用它本身)产生线程,然后再调用start()方法。 两种方法的不同点:继承Thread类有一个缺点就是单继承,而实现Runnable接口则弥补了它的缺点,可以实现多继承 

    下面用例子来做说明 程序1:

     package com.testThread; public class testThread extends Thread { private String name; public testThread(String name) { this.name = name; } // 如果要使用多线程,则必须有一个方法的主体 public void run() { // 打印输出 for (int i = 0; i < 10; i++) { System.out.println(this.name + "----->运行、、、、"); } } public static void main(String args[]) { new testThread("线程A").start(); new testThread("线程B").start(); new testThread("线程C").start(); } }

     

    程序的运行结果是:

    这是继承了Thread类,第一种方法产生多个Runnable实例对象,然后用Thread产生多个线程

     

     


     

    第二种方法,因为这个类已经继承了Thread类,所以就可以直接利用它本身产生多个线程

    程序2:

    package thread3; public class MyThread1 implements Runnable { private int ticket = 10; public void run() { for (int i = 0; i < 500; i++) { if (this.ticket > 0) { System.out.println("卖票----->" + (this.ticket--)); } } } public static void main(String args[]) { MyThread1 mt = new MyThread1(); Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }

     

    程序运行结果:

    卖票----->10

    卖票----->9

    卖票----->8

    卖票----->7

    卖票----->6

    卖票----->5

    卖票----->4

    卖票----->3

    卖票----->2

    卖票----->1

    把以下代码稍稍改动一下:

    package thread3; public class MyThread1 implements Runnable { private int ticket = 10; public void run() { for (int i = 0; i < 500; i++) { if (this.ticket > 0) { this.ticket--; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } System.out.println("卖票----->" + (this.ticket)); } } } public static void main(String args[]) { MyThread1 mt = new MyThread1(); Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }

     

    程序运行结果发生了如下变化:

     

    卖票----->7

    卖票----->7

    卖票----->7

    卖票----->4

    卖票----->4

    卖票----->2

    卖票----->1

    卖票----->0

    卖票----->0

    卖票----->0

    这就是所谓的线程不安全。。。

    最新回复(0)