引言

第一篇文章讲到了Java多线程的概念和作用,本篇文章则介绍在Java中如何开启多线程。

延伸阅读,Java多线程系列文章

Java进阶 ——— Java多线程(一)之进程和线程
Java进阶 ——— Java多线程(二)之如何开启多线程
Java进阶 ——— Java多线程(三)之多线程同步问题

开启方式

Java开启多线程有三种方式

继承Thread类
实现Runnable接口
java.util.concurrent.ThreadFactory 中的线程创建

继承Thread类

  • 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务。因此把run方法称为线程执行体。

  • 创建Thread子类的实例,即创建了线程对象。

  • 调用线程对象的start()方法来启动该线程。切记是调用start()方法
    示例代码:

    public class ThreadTest {

    private int age = 10;
    public  void threadTest(){
    	
    	for (int i = 0; i < 100; i++) {
    		Thread thread =	new NewThread();
    		thread.start();
    	}
    }
    
    class NewThread extends Thread{
    	@Override
    	public void run() {
    		age++;
    		System.out.println(age);
    	}
    }
    

    }

输出日志

注意
通过下列匿名内部类的方式也可以开启多线程,本质也是实现了Runnable接口,并作为参数传递给Thread类,但是不推荐这样实现,因为在Android中,例如在Activity中使用匿名内部类方式,匿名内部类会持有外部类的引用,在Activity销毁时,如果线程执行未结束,导致Activity占用内存无法释放,造成内存泄漏。

/**
  * 避免这种方式
  /
new Thread(new Runnable() {
			
			public void run() {
				//执行体
			}
		}).start();

实现Runnable接口

  • 定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体

  • 创建Runnable实现类的实例对象,并以此实例对象作为Thread的target来创建Thread类,该Thread对象才是真正的线程对象。

  • 调用线程对象的start()方法来启动该线程。切记是调用start()方法
    示例代码:

    public class ThreadTest {

    private int age = 10;
    public  void threadTest(){
        //实际的线程依然需要Thread实例对象,Thread才真正创建线程对象
    	for (int i = 0; i < 100; i++) {
    		Thread thread =	new Thread(new ThreadRunnable());
    		thread.start();
    	}
    }
    
    class ThreadRunnable implements Runnable {
    
    	@Override
    	public void run() {
    		age++;
    		System.out.println(Thread.currentThread().getName() +"----"+ age);		}
    }
    

    }

注意
Runable实现类里包含run方法,仅仅作为线程执行体,而实际的线程对象依然是Thread实例对象,Thread为真正创建线程的对象。

实现Runnable接口比继承Thread类所具有的优势:
  • 因为Java不支持多继承,但可以多实现,所以实现Runnable接口可以有效避免Java中单继承的限制。
  • 线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
  • Java推荐使用组合而不是继承

java.util.concurrent.ThreadFactory 中的线程创建

java.util.concurrent 包中包含一个将线程创建抽象化的ThreadFactory 接口。利用该接口,我们可以将以Runnable 作为传入参数并通过new 创建Thread 实例的处理隐藏在ThreadFactory 内部。典型用法如下所示。默认的ThreadFactory 对象是通过Executors.defaultThreadFactory 方法获取的。

示例代码:

public  void threadTest(){

		for (int i = 0; i < 100; i++) {
			ThreadFactory factory = Executors.defaultThreadFactory();
            //此处的ThradRunnable是第二种方式中实现Runnable接口的类
			factory.newThread(new ThreadRunnable()).start();
		}
	}

总结

上面罗列了三种启动多线程的方式,包括继承Thread类,实现Runnable接口,使用ThreadFactory线程创建,推荐使用第二种,毕竟组合优于继承

感谢

http://wwwblogs/albertrui/p/8376790.html

)

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

更多推荐

Java进阶 ——— Java多线程(二)之如何开启多线程