了解多线程

初学Java之后,下面是我对线程的理解,分享给大家。

首先,我们得了解线程是什么?

 线程的定义:进程中的一个执行流程,是程序执行流的最小单元。

  线程的作用:执行一段或一组代码,这组代码也通常称为任务。

 

我们多多少少都听说,代码的执行效率跟CPU是有关的。为什么有关呢。这时候我们就要去了解CPU跟线程的关系?

线程是CPU调度和分配的基本单位。

  线程自己是不能执行自己的任务的,它需要一个执行环境,而CPU就是这个环境。

  所以任务,线程,CPU的关系如下图:

 

了解了线程的执行原理之后,我们又要了解,为什么要用多线程。

这个问题的答案百度也一大堆,就是为了充分利用CPU资源

在一个程序中只有主线程,但可以有多个子线程。如果我们的程序只有一个线程执行整个程序的代码,那么效率就会很低。所以上面答案很容易理解。

下面是创建线程的方法

第一种、继承Thread类,重写run方法,然后调用start方法启动线程。

代码实现如下:

public class ThreadDemo {

         public static void main(String[] args) {

                   Thread01 thread=new Thread01();

                   Thread01 thread2=new Thread01();

                   thread.start();

                   thread2.start();

         }

}

class Thread01 extends Thread{

         @Override

         public void run() {

                   System.out.println("线程的id" + getId());

                   System.out.println("线程的名称:" + getName());

                  

                   for (int i = 0; i < 50; i++) {

                   System.out.println("线程的id" + getId() + " 线程的名称:"

                   + getName());

                   }

         }

}

第二种、实现Runnable接口,重写run方法,调用start方法启动线程。

public class ThreadDemo {

         public static void main(String[] args) {

                   Thread01 thread=new Thread01();

                   Thread thread1 = new Thread(thread);

                   Thread thread2 = new Thread(thread);

                   thread1.start();

                   thread2.start();

         }

}

class Thread01 implements Runnable{

         @Override

         public void run() {

                   //实现Runnable接口的,无法直接使用getId()getName()等方法

                   // 需要使用Thread.currentThread() 来获取到当前对象才行

                   System.out.println("线程的id" + Thread.currentThread().getId());

                   System.out.println("线程的名称:" +  Thread.currentThread().getName());

                  

                   for (int i = 0; i < 50; i++) {

                   System.out.println("线程的id" +  Thread.currentThread().getId() + " 线程的名称:"

                   +  Thread.currentThread().getName());

                   }

         }

}

第三种、(可带返回值)使用CallableFutureTask,重写call方法。

代码如下:

public static String fun() throws InterruptedException, ExecutionException{

       //创建Callable实例,给定返回类型为String

       Callable<String> callable=new Callable<String>() {  

           //重写call方法

        @Override

        public String call() throws Exception {

            // TODO Auto-generated method stub

            Random random=new Random();

            int i=random.nextInt(50);

            //返回一个随机数

            return String.valueOf(i);

        }

    };

       //创建FutureTask实例,包装callable对象

       FutureTask<String> futureTask=new FutureTask<String>(callable);

       //创建并启动线程

       new Thread(futureTask).start();

       //调用get方法回去返回值。

       String str=futureTask.get();

       return str;

   }

调用代码如下:

public static void main(String[] args) throws InterruptedException, ExecutionException {

        // TODO Auto-generated method stub

        String str=  Demo.fun();

        System.out.println(str);

    }

结果如下:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值