Java多线程之两种传统创建方式

本文详细介绍了Java中的多线程概念,包括程序、进程和线程的区别。通过代码示例展示了两种创建多线程的方法:继承Thread类和实现Runnable接口,并分析了它们的适用场景。在面对共享数据时,实现Runnable接口的方式提供了更好的数据共享机制。
摘要由CSDN通过智能技术生成

Java多线程详解

概念讲解
  1. 什么是程序?线程?进程?
    答:
    程序(program):是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。
    进程:(process):程序的一次执行过程,或是一个正在运行的程序(有它自身的产生、存在和消亡的过程——生命周期)
    • 程序是静态的,进程是动态的
    • 进程作为资源调度的单位
      线程(Thread):进程可以进一步细化成线程,是一个程序内部的一条执行路径
    • 一个进程可以含有多个线程
    • 线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器
    • 由于多线程,系统资源会存在一定的安全隐患
  2. 如何用代码创建一个简单的多线程代码?
    • 传统意义上来说JDK8之前都有两种创建多线程的方式
      1. 继承Thread的方式来创建多线程
      package com.ahpu.cn;
      /**
       * @author JackWang
       * @date 2020/11/3 13:12
       * @e-mail:JackWang_1018@outlook.com
       * @version:1.0
       * @title:主要介绍一下常用的Thread类中的方法
       */
      
      
      
      public class TestThread {
      	public static void main(String[] args) {
      		TestThread1 t1 = new TestThread1();//创建一个TestThread1对象,来调用run中的操作
      		t1.setName("线程1");
      		t1.setPriority(5);
      		t1.start();
      
      
      		Thread.currentThread().setName("主线程");//主线程的相关操作,简单的理解成main进程就行
      		for (int i = 1; i < 100; i++) {
      			if (i % 2 == 0) {
      				System.out.println(Thread.currentThread().getName()+":" + i);//注释一下,这个Thread.currentThread().getName()函数的作用就是获得当前进程名称
      			}
      		}
      	}
      }
      
      class TestThread1 extends Thread {//创建一个继承自Thread的类TestThread1
      	@Override
      	public void run() {//重写Thread中的run()
      		for (int i = 0; i < 100; i++) {
      			if (i % 2 == 0) {
      				System.out.println(currentThread().getName()+":权限"+Thread.currentThread().getPriority() + ":" + i);
      			}
      		}
      	}
      }
      
      
      
    1. 实现Runnable接口的方式来创建多线程
    package com.ahpu.cn;
    
    /**
     * @author JackWang
     * @date 2020/11/13 0:52
     * @e-mail:JackWang_1018@outlook.com
     * @version:1.0
     * @title:创建多线程的方式二:实现Runnable接口的类
     */
    
    /**
     * 1.创建一个实现了Runnable接口的类
     * 2.实现类去实现Runnable中的抽象方法:run()
     * 3.创建实现类的对象
     * 4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
     * 5.通过Thread类的对象调用start()
     */
    
    class MThread implements Runnable {
    	@Override
    	public void run() {
    		for (int i=0;i<100;i++){
    			System.out.println(Thread.currentThread().getName()+":"+i);
    		}
    	}
    }
    
    public class ThreadTest2 {
    	public static void main(String[] args) {
    		//3.创建现实类的对象
    		MThread test1 = new MThread();
    		//4.将次对象作为参数传递到Thread类的构造器中,创建Thread类的对象
    		Thread test2 = new Thread(test1);
    		test2.setName("线程1");
    		//5.通过Thread类的对象调用start():①启动线程②调用当前线程的run()
    		test2.start();
    
    		Thread test3 = new Thread(test1);
    		test3.setName("线程2");
    		test3.start();
    	}
    }
    
  3. 两种方法的比较
    答:我们知道在Thread继承创建多线程的过程中,如果要共享一个数据,那必须得创建一个static类型的值,然而在实现Runnable接口来创建多线程的过程中,
    只要你传入的对象是同一个对象,那么我们可以看到它此时调用的就是同一个数据值,所以在面对enmm多线程调用同一个数据的情况下我们还是用这个实现类接口的方法比较好
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值