《Java从入门到放弃》JavaSE入门篇:多线程(入门版)

学习多线程之前,我们先搞清楚,为什么要使用多线程?~~Look

《Java从入门到放弃》JavaSE入门篇:多线程(入门版)_第1张图片

这就是标准的多线程的使用场景。一个锅可以同时煮多个菜,同一时间能有多个人在锅里夹菜。

 

小结:多线程的目的,就是为了解决需要同时运行多个任务的场合。

按官方的说法,多线程帮助你写出CPU最大利用率的高效程序,因为空闲时间保持最低,这对Java运行的交互式的网络互连环境是至关重要的,例如:网络的数据传输速率远低于计算机的处理能力,在传统的单线程环境中,你的计算机必须花费大量的空闲时间来等待,多线程能够使你充分利用这些空闲时间

与进程关联紧密的还有一个术语,叫进程。进程是指系统中正在运行的程序。一台电脑可以运行多个进程,一个进程又可以分为多个线程来运行。比如在电脑上可以同时玩吃鸡游戏、用QQ音乐听歌、再运行两个QQ聊天,同时再开一个直播平台赚点网费。j_0028.gif

Java中实现线程有两种方式

一、扩展java.lang.Thread类

二、实现java.lang.Runnable接口


Thread类包含几个重要方法,如下图:

《Java从入门到放弃》JavaSE入门篇:多线程(入门版)_第2张图片

注意:Java程序启动时,一个线程就立刻运行,它执行main方法,这个线程被称为主线程。所有线程都依赖该线程,如果关闭它

,其他所有子线程都会被关闭。

接下来写个做饭的例子吧。

public class CookRiceThread extends Thread {
	@Override
	public void run() {
		try {
			System.out.println("开始煮饭...");
			//为了节约时间,我们假设煮饭只需要11秒
			Thread.sleep(11000);
			System.out.println("饭煮熟了!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

public class CookThread extends Thread {
	@Override
	public void run() {
		try {
			//做5个菜,每个菜2.5秒做好
			for (int i = 1; i <= 5; i++) {
                System.out.println("开始做第" + i + "个菜...");
                Thread.sleep(2500);
                System.out.println("第" + i + "个菜做好了。");
            }
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

public static void main(String[] args) {
    CookThread cook = new CookThread();
    cr.start();
    cook.start();
}

运行结果如下:

《Java从入门到放弃》JavaSE入门篇:多线程(入门版)_第3张图片

当然,计算机的运行方式跟我们现实中吃火锅是有区别的。假如你的电脑是单CPU的,各个线程在运行时通过轮流获得CPU的使用权来执行各自的任务。所以线程需要通过优先级来区别谁先执行,优先级通过setPriority和getPriority方法来使用。线程的默认优先级是5.

下面的例子,我们通过实现接口的方式,来了解线程的优先级。

//自定义线程,实现Runnable接口
class MyThread implements Runnable {  
    public void run() {
        String strName = Thread.currentThread().getName();
        System.out.println();
        for (int i = 0; i < 10; i++) {
            System.out.print(strName + ":" + i+" ");
        }
    }
}

public static void main(String[] args) {
    //三个线程
    Thread t1 = new Thread(new MyThread());  //第一个自定义线程
    Thread t2 = new Thread(new MyThread());  //第二个自定义线程
    Thread t3 = Thread.currentThread();      //获得当前线程,即主线程

    t1.setName("t1"); 
    t2.setName("t2"); 
    t3.setName("t3");

    t1.setPriority(Thread.MAX_PRIORITY);   //设置线程的优先级
    t2.setPriority(Thread.MIN_PRIORITY);

    System.out.println(t1.getName() + "的优先级:" + t1.getPriority());
    System.out.println(t2.getName() + "的优先级:" + t2.getPriority());
    System.out.println(t3.getName() + "的优先级:" + t3.getPriority());
    t1.start(); 
    t2.start();
    String strName = t3.getName();
    System.out.println();
    for (int i = 0; i < 10; i++) {
        System.out.print(strName + ":" + i+" ");
    }
}

根据电脑不同,运行的结果会有所区别:

《Java从入门到放弃》JavaSE入门篇:多线程(入门版)_第4张图片

《Java从入门到放弃》JavaSE入门篇:多线程(入门版)_第5张图片

最后对线程状态简单介绍,毕竟入门级水平基本不用管太多多线程,等以后碰到的时候再来好好研究吧。

  1. 新建状态(New):使用new关键字创建线程对象,仅仅被分配了内存;
  2. 就绪状态(Ready):线程对象被创建后,等待它的start方法被调用,以获得CPU的使用权;
  3. 运行状态(Running):执行run方法,此时的线程的对象正占用CPU;
  4. 睡眠状态(Sleeping):调用sleep方法,线程被暂停,睡眠时间结束后,线程回到就绪状态,睡眠状态的线程不占用CPU;
  5. 死亡状态(Dead):run方法执行完毕后,线程进入死亡状态;
  6. 阻塞状态(Blocked):线程由于某些事件(如等待键盘输入)放弃CPU,暂停运行,直到线程重新进入就绪状态,才有机会转到运行状态;

《Java从入门到放弃》JavaSE入门篇:多线程(入门版)_第6张图片

 

多线程入门级内容到这儿就结果了,如果觉得意犹未尽,那就·································自行百度吧,哈哈!
j_0019.gif

 

你可能感兴趣的:(Java从入门到放弃)