请教:java线程问题。创建Thread

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教:java线程问题。创建Thread相关的知识,希望对你有一定的参考价值。

我们老师说创建线程有5种方式(继承Thread、实现Runnable、实现Callable、线程池?、精灵线程什么的??),请问他说的合理吗?

《Java编程思想》里有这方面的讨论。

1. 继承Thread类创建线程

class MyThread extends Thread
    @Override
    public void run()
        //things to do
    

然后就可以通过 new MyThread().start()启动线程了


2. 实现Runnable接口

class MyThread implements Runnable
    @Override
    public void run()
        //things to do
    }

//创建线程
new Thread(new MyThread()).start();
//按照《Java编程思想》上说的,实现Runnable接口并不会产生任何内在的线程能力,要实现线程的行为,就必须显式地将一个任务附着到线程上。


3. 实现Callable

Runnable不返回任何值,如果希望在任务完成时返回一个值,就实现Callable接口而不是Runnable接口。


4. 线程池

线程池通过java.util.concurrent包中的Executor管理Thread对象,简化并发编程。

import java.util.concurrent.*;
public class CachedPool
    public static void main(String[] args)
        //创建线程池
        ExecutorService exec = Executors.newCachedThreadPool();
        for(int i = 0; i < 5; i++)
            //通过线程池来管理线程
            exec.execute(new MyThread());
        
        //执行结束关闭线程池,释放资源
        exec.shutdown();
    }


5. 精灵线程

不清楚这里的精灵线程指的是不是Daemon Thread。Daemon Thread在线程创建之后,运行之前,调用setDaemon()就可以了。

Thread t = new Thread(MyThread());
t.setDaemon();
t.start();


这样看来,我觉得精灵线程应该不算是创建线程的方式(如果我对精灵线程的理解没有错误的话)。


我也是初学java,可能理解还不到位,错误的地方希望大家批评指正。谢谢。

参考技术A 合理。
这是对应不同需要的。
Thread 是线程 类,继承它自然就可以实现了。
当不能继承的时候,怎么办 就要用 实现Runnable或 实现Callable
你也许会问为什么不能继承。
比如一个窗口,你已经继承了JFrame,现在要实现线程的功能,就只能是 实现Runnable
参考技术B 在创建,实现的角度上来讲,是合理的
但是 实际底层上 都 还是 继承Thread、实现Runnable

Java多线程Thread的创建

       Java中线程的创建有两种方式:

1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中

2.  通过实现Runnable接口,实例化Thread类

第一种方式:继承Thread类

package com.yyx.thread;
/**
 * 通过继承Thread类创建线程
 * yyx 2018年2月4日
 */
public class CreateThreadByextends {
    public static void main(String[] args) {
        ExtendThread extendThread = new ExtendThread();
        extendThread.setName("线程一");//设置线程名称
        extendThread.start();
        for (int i = 1; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}

class ExtendThread extends Thread {

    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

}

第二种方式:实现Runnable接口

package com.yyx.thread;
/**
 * 推荐:通过实现Runnable接口创建线程
 * yyx 2018年2月4日
 */
public class CreateThreadByInterface {
    public static void main(String[] args) {
        SubThread subThread=new SubThread();
        Thread thread=new Thread(subThread, "线程一");        
        thread.start();//一个线程只能够执行一次start()
        for(int i = 1;i <= 100;i++){
            System.out.println(Thread.currentThread().getName() +":" + i);
        }
    }
}

class SubThread implements Runnable {

    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

}

 第三种方式:使用Calable和Future创建具备返回值的线程

package com.yyx.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 使用Calable和Future创建具备返回值的线程 yyx 2018年2月6日
 */
public class CreateThreadByCallable implements Callable<Integer> {
    public static void main(String[] args) {
        CreateThreadByCallable createThreadByCallable=new CreateThreadByCallable();
        FutureTask<Integer> task=new FutureTask<Integer>(createThreadByCallable);
        new Thread(task,"有返回值的线程").start();
        try {
            System.out.println(task.get());
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public Integer call() throws Exception {
        Integer total=0;
        for(int i=1;i<=50;i++){
            total+=i;
        }
        return total;
    }
}

 

以上是关于请教:java线程问题。创建Thread的主要内容,如果未能解决你的问题,请参考以下文章

Threadjava线程之对象锁类锁线程安全

线程的基本概念 / 计算机程序的思维逻辑

请教各位 java 线程池 出现异常的问题! 问题如下: 为啥会出现异常??

java和native代码之间有啥方法可以实现并发吗?本机代码作为进程/线程运行

java线程问题

Java中线程池,你真的会用吗?