java线程怎么写?java创建线程写法

阳光 2022-04-12 17:05:05 java常见问答 5334

线程是一个动态执行的过程,对于java线程的创建每一个程序员都需要掌握,但是有些新手java人员不清楚java线程怎么写?下面我们就为大家分享一些java创建线程写法,希望能够帮助到大家!

Java 提供了三种创建线程的方法:

通过实现 Runnable 接口;

通过继承 Thread 类本身;

通过 Callable 和 Future 创建线程。

一.通过实现 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.

二.通过继承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.

三.通过 Callable 和 Future 创建线程

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

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

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

4. 调用 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内存溢出的几种原因和解决办法

json格式如何打开成pdf?打开json格式文件的方法有哪些?

程序员面试自我介绍怎么说?程序员面试要注意什么?

推荐内容