java线程怎么用?java线程使用之线程创建方法

阳光 2022-04-08 15:21:40 java常见问答 6615

java线程的创建永远是java重要知识点,作为java程序员,如果你还不会java线程创建那可就有些落后了!所以对于java线程创建一定要会!那今天我们就给大家分享一下java线程创建方法!

Java 创建线程的方法:

1.通过实现 Runnable 接口来创建线程

创建一个线程,最简单的方法是创建一个实现 Runnable 接口的类。

为了实现 Runnable,一个类只需要执行一个方法调用 run(),声明如下:

public void run()

你可以重写该方法,重要的是理解的 run() 可以调用其他方法,使用其他类,并声明变量,就像主线程一样。

在创建一个实现 Runnable 接口的类之后,你可以在类中实例化一个线程对象。

Thread 定义了几个构造方法,下面的这个是我们经常使用的:

Thread(Runnable threadOb,String threadName);

这里,threadOb 是一个实现 Runnable 接口的类的实例,并且 threadName 指定新线程的名字。

新线程创建之后,你调用它的 start() 方法它才会运行。

void start();

下面是一个创建线程并开始让它执行的实例:

实例

class RunnableDemo implements Runnable
{
    private Thread t;
    private String threadName;
    RunnableDemo(String name)
    {
        threadName = name;
        System.out.println("Creating " + threadName);
    }
    public void run()
    {
        System.out.println("Running " + threadName);
        try
        {
            for (int i = 4; i > 0; i--)
            {
                System.out.println("Thread: " + threadName + ", " + i);
                // 让线程睡眠一会
                Thread.sleep(50);
            }
        }
        catch (InterruptedException e)
        {
            System.out.println("Thread " + threadName + " interrupted.");
        }
        System.out.println("Thread " + threadName + " exiting.");
    }
    public void start()
    {
        System.out.println("Starting " + threadName);
        if (t == null)
        {
            t = new Thread(this, threadName);
            t.start();
        }
    }
}
public class TestThread
{
    public static void main(String args[])
    {
        RunnableDemo R1 = new RunnableDemo("Thread-1");
        R1.start();
        RunnableDemo R2 = new RunnableDemo("Thread-2");
        R2.start();
    }
}

编译以上程序运行结果如下:

Creating Thread - 1
Starting Thread - 1
Creating Thread - 2
Starting Thread - 2
Running Thread - 1
Thread: Thread - 1, 4
Running Thread - 2
Thread: Thread - 2, 4
Thread: Thread - 1, 3
Thread: Thread - 2, 3
Thread: Thread - 1, 2
Thread: Thread - 2, 2
Thread: Thread - 1, 1
Thread: Thread - 2, 1
Thread Thread - 1 exiting.
Thread Thread - 2 exiting.

2.通过继承Thread来创建线程

创建一个线程的第二种方法是创建一个新的类,该类继承 Thread 类,然后创建一个该类的实例。

继承类必须重写 run() 方法,该方法是新线程的入口点。它也必须调用 start() 方法才能执行。

该方法尽管被列为一种多线程实现方式,但是本质上也是实现了 Runnable 接口的一个实例。

实例

class ThreadDemo extends Thread
{
    private Thread t;
    private String threadName;
    ThreadDemo(String name)
    {
        threadName = name;
        System.out.println("Creating " + threadName);
    }
    public void run()
    {
        System.out.println("Running " + threadName);
        try
        {
            for (int i = 4; i > 0; i--)
            {
                System.out.println("Thread: " + threadName + ", " + i);
                // 让线程睡眠一会
                Thread.sleep(50);
            }
        }
        catch (InterruptedException e)
        {
            System.out.println("Thread " + threadName + " interrupted.");
        }
        System.out.println("Thread " + threadName + " exiting.");
    }
    public void start()
    {
        System.out.println("Starting " + threadName);
        if (t == null)
        {
            t = new Thread(this, threadName);
            t.start();
        }
    }
}
public class TestThread
{
    public static void main(String args[])
    {
        ThreadDemo T1 = new ThreadDemo("Thread-1");
        T1.start();
        ThreadDemo T2 = new ThreadDemo("Thread-2");
        T2.start();
    }
}

编译以上程序运行结果如下:

Creating Thread - 1
Starting Thread - 1
Creating Thread - 2
Starting Thread - 2
Running Thread - 1
Thread: Thread - 1, 4
Running Thread - 2
Thread: Thread - 2, 4
Thread: Thread - 1, 3
Thread: Thread - 2, 3
Thread: Thread - 1, 2
Thread: Thread - 2, 2
Thread: Thread - 1, 1
Thread: Thread - 2, 1
Thread Thread - 1 exiting.
Thread Thread - 2 exiting.

3.通过 Callable 和 Future 创建线程

创建 Callable 接口的实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。

创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。

使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。

调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。

实例

public class CallableThreadTest implements Callable < Integer >
{
    public static void main(String[] args)
    {
        CallableThreadTest ctt = new CallableThreadTest();
        FutureTask < Integer > ft = new FutureTask < > (ctt);
        for (int i = 0; i < 100; i++)
        {
            System.out.println(Thread.currentThread()
                .getName() + " 的循环变量i的值" + i);
            if (i == 20)
            {
                new Thread(ft, "有返回值的线程")
                    .start();
            }
        }
        try
        {
            System.out.println("子线程的返回值:" + ft.get());
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        catch (ExecutionException e)
        {
            e.printStackTrace();
        }
    }
    @Override
    public Integer call() throws Exception
    {
        int i = 0;
        for (; i < 100; i++)
        {
            System.out.println(Thread.currentThread()
                .getName() + " " + i);
        }
        return i;
    }
}

我们可以通过以上三种方式创建java线程,不过采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。

推荐阅读:

数据库索引面试题有哪些?常见的数据库索引面试题

java有内存泄漏分析工具吗?java内存泄漏最直接表现是什么?

fastjson如何解析byte数组返回?byte数组如何转换为int?