初始多线程

一、什么是多线程

多线程指的是从软件或硬件上多个线程并发执行的技术。
多线程:前提,研究的单核CPU
多线程:**宏观并行,微观串行**

单核CPU中,不存在真正的”并行“概念, 多个线程实际是在交替的占用CPU,而并不是真正”并行执行“

二、进程和线程的关系:

进程:应用程序的执行实例;有独立的内存空间 和系统资源

线程:将进程可以进一步细分 为线程 ;CPU调度和分派的最小单位

例如,QQ是一个进程,QQ又可以细分多个功能(接收消息、发送消息),每个功能都可以通过一个线程来实现。

三、多线程实例

多线程并不是绝对的可以提高效率。

多线程可以充分的利用CPU资源,提高效率,但多线程并不是 越多越好,原因: 每开启一个线程 会占用1M左右的内存,因此太多的线程会占用 大量的内存资源。单线程有时候 性能也非常不错,例如NodeJs、Netty、NIO都是基于单线程的多路复用技术,性能不比多线程差。

public class Thread01 {
	//我们一直在使用的main()就是一个线程,并且是主线程
   public static void main(String[] args) {
	   //获取当前线程
	   Thread t=Thread.currentThread();
	   //输出当前线程的名称
	   System.out.println(t.getName());
	   //修改线程的名称
	   t.setName("sunzhilin");
	   //输出当前线程的名称
	   System.out.println(t.getName());
 }
}

在java中可以通过以下两种 基础方式 创建线程:

继承java.lang.Thread类

实现java.lang.Runnable接口

多个线程之间 是在“争夺”资源。举个例子,如果A和B连个线程去争夺cpu使用权,如果争夺了200次。那么这200次中的某一次 是被A还是B占用,可以理解随机的。

线程在执行时两个最重要的方法:

将线程的执行逻辑(线程要做的事情)写在run()中
启动线程,是通过start()启动。 start() = 准备资源 + 调用run() 。线程的启动不能使用run.
通过thread实现多线程

public class ThreadDemo01 extends Thread{

//线程的执行方法
@Override
public void run() {
    for(int i=0;i<100;i++){
        System.out.println(   Thread.currentThread().getName()+":"+i  );
    }
}

public static void main(String[] args) {
    ThreadDemo01 t1 = new ThreadDemo01();
    t1.setName("t1");
    ThreadDemo01 t2 = new ThreadDemo01();
    t2.setName("t2");

    t1.start();
    System.out.println("--------");
    t2.start();
}

}
通过RUnnable实现多线程

public class ThreadDemo02 implements Runnable {

//线程执行的方法
@Override
public void run() {
    for(int i=0;i<100;i++){
        System.out.println(   Thread.currentThread().getName()+":"+i  );
    }
}

//Runnable方式仍然是借用Thread来实现的多线程
public static void main(String[] args) {
    ThreadDemo02 t1 = new ThreadDemo02();
    ThreadDemo02 t2 = new ThreadDemo02();


    //启动线程需要使用start()方法,但是Runnable没有提供start(),如何解决?
    //Thread有start()   Runnable没有start()
    //Runnable ->Thread
    //Thread(Runable )
    Thread th1 = new Thread(  t1);
    Thread th2 = new Thread(  t2);
    th1.setName("T1");
    th2.setName("T2");
    th1.start();

    th2.start();


}

}
推荐使用Runnable实现多线程。因为现在的主流是 面向接口开发,即建议尽量使用接口 而不要使用继承。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值