关于java线程的学习

本文探讨了线程的概念,与进程的区别,展示了Java通过继承Thread、实现Runnable和Callable接口创建线程的方法,同时解析了run与start的差异,并通过实例演示了如何用多线程模拟龟兔赛跑。
摘要由CSDN通过智能技术生成

线程的概念以及他和进程的区别

线程是cpu资源分配的最小单元,进程是程序执行相关资源(CPU、内存、磁盘等) 的最小单元,进程之间相互独立,有自己的内存空间,进程包含一个或着多个线程线程需要的资源更少,可以看做是一种轻量级的进程,线程会共享进程中的内存,线程也有独立的空间(栈、程序计数器),线程相互通信更加方便

线程的实现

Java几种实现线程的方式

  1. 继承Thread类

  2. 实现Runnable接口

  3. 实现Callable接口

  4. 使用线程池

 继承Thread类

/**
 * 自定义线程类
 */
class MyThread extends Thread{

    /**
     * 执行指令
     */
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() +"执行了" + i);
        }
    }
}

public class ThreadDemo {

    public static void main(String[] args) {
        //创建线程对象
        MyThread myThread = new MyThread();
        //启动线程
        myThread.start();
        //主线程执行
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() +"执行了" + i);
        }
    }
}

实现Runnable接口

/**
 * 实现Runnable接口的类
 */
class MyRunnable implements Runnable{

    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "--" + i);
        }
    }
}
public class RunnableDemo {
    public static void main(String[] args) {
        //创建Runnable对象,传入Thread对象
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        //启动线程
        thread.start();
}
}

实现Callable接口

/**
 * 实现Callable接口
 */
class MyCallable implements Callable<Long> {

    @Override
    public Long call() throws Exception {
        //模拟复杂运算
        long sum = 0;
        for(long i = 0;i < 1000000000L;i++){
            sum += i;
        }
        return sum;
    }
}
public class CallableDemo {

    public static void main(String[] args) {
        //创建Callable对象,传入FutureTask对象
        FutureTask<Long> task = new FutureTask<>(new MyCallable());
        //创建FutureTask对象到Thread对象中
        Thread thread = new Thread(task);
        //启动线程
        thread.start();
        System.out.println("-----等待结果-----");
        //获得返回值
        try {
            System.out.println(task.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

各自的好处

继承Thread类就自己写run方法,而实现Runable接口则run方法被写死,回返了代码,从这个方面来说,Runnable是要更好的,而实现Callable接口可以得到一个返回值

线程的run和start的区别

  • run没有启动新线程,在主线程中执行

  • start才能启动新线程

 线程常用的一些方法

方法效果
start()启动
stop()停止
getName获得线程名字
setName设置线程名字
sleep睡眠,单位是毫秒
setPriority设置优先级
join()  线程的加入(合并),让其他的执行完,再执行自己的指令

 最后,用线程做个小游戏

多线程模拟龟兔赛跑:

乌龟和兔子进行1000米赛跑,兔子前进5米,乌龟只能前进1米。

但兔子每20米要休息500毫秒,而乌龟是每100米休息500毫秒。

谁先到终点就结束程序,并显示获胜

public class task4 {
    static Thread thread1=null;
    static Thread thread2=null;
    public static void main(String[] args) {
       thread1  = new Thread(()->{
           //兔子
          for (int i=0;i<=1000;i+=5){
              if (i%20 == 0){
                  try {
                      Thread.sleep(500);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
              System.out.println("兔子跑到了"+i+"米");
              if (i==1000){
                  System.exit(0);}
          }
       });
       thread2 = new Thread(()->{
          //乌龟
          for (int i=0;i<=1000;i++){
              if (i%100==0){
                  try {
                      Thread.sleep(500);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
              System.out.println("乌龟跑到了"+i+"米");
              if (i==1000){
              System.exit(0);}
          }
       });
       thread1.start();
       thread2.start();
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值