【Java基础】Java多线程(1)线程基础

    假设我们想要编写一个程序从1加到100,那很简单写一个for循环就可以了,那范围再大些,比如从1加到1亿、10亿…呢?或许我们也可以采用循环来完成,但十分庞大的数字,让计算机来处理也需要一段时间。我们有没有其他办法呢?答案当然是有了,我们可以将1到1亿的数字划分为多个片段,开启多个线程让它们分别处理其中的一段,然后再将这些线程的处理结果加起来。这便是采用多线程来解决问题了。(或许这并不是解决这个问题最好的办法,但这里我们仅仅是使用这个场景来说明而已)

    当然上述情景只是运用多线程的一个小小的例子,多线程的使用范围是很广泛的。比如,服务器可以同时处理来自多个客户端的请求,JVM后台中运行着垃圾回收线程等等

    需要说明的是,多线程正是运用了现代计算机具有多处理器的特点,多个线程可以跑在不同的处理器上。如果是单处理器的来说,虽然也能处理多个线程,但其是并发处理的,通俗点就是处理器在多个线程之间来回切换。

接下来看一下线程的使用:

一、继承Thread类,重写run()方法:

class ThreadTest extends Thread {

    //线程执行体
    public void run() {
        int i = 0;
        for(;i<20;i++) {
            System.out.println(this.getName() + " " + i);
        }
    }
}

public class ThreadMain {

    public static void main(String[] args) {
        for(int i=0;i<20;i++) {
            System.out.println(Thread.currentThread().getName()+" "+i);

            if(i == 5) {
                new ThreadTest().start();
            }
        }
    }
}

二、实现Runnable接口,重写run()方法

class RunnableTest implements Runnable {

    //线程执行体
    public void run() {
        int i = 0;
        for(;i<20;i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

public class RunnableMain {
    public static void main(String[] args) {
        for(int i=0;i<20;i++) {
            System.out.println(Thread.currentThread().getName()+" "+i);

            if(i == 5) {
                RunnableTest rt = new RunnableTest();
                new Thread(rt , "新线程").start();
            }
        }
    }
}

    Thread是通过继承Thread类来实现的,Runnable是通过实现Runnable接口来实现的,结合Java语言的特性:单继承多实现,如果一个类要继承基类,同时也要实现多线程,这种情况可以使用Runnable来实现。通过上面两个例子,可以看出来,线程的run方法是没有返回值的,下面这种方式可以获取线程的返回值。

三、实现Callable接口,实现call方法

class CallableTest implements Callable<Integer> {
    //线程执行体
    public Integer call() {
        int i = 0;
        for( ; i < 20 ; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
        return i;
    }
}

public class FutureMain {

    public static void main(String[] args) {
        CallableTest ct = new CallableTest();
        
        //Future代表Callable接口里call()方法的返回值
        //FutureTask实现了Future、Runnable接口,可作为Thread的target传入
        FutureTask<Integer> task = new FutureTask<Integer>(ct);

        Thread thread = null;

        for(int i = 0 ; i < 20 ; i++) {
            System.out.println(Thread.currentThread().getName());
            if(i == 5) {
                thread = new Thread(task,"有返回值的线程");
                thread.start();
            }
        }

        try {
            System.out.println("子线程:" + thread.getName() + "-->" + task.get());
        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }

}

如有不当之处,欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值