支持多线程是Java语言的特性之一,多线程使程序可以同时存在多个执行片段,根据不同的条件和环境同步或异步工作。线程与进程的实现原理类似,但它们的服务对象不同,进程代表操作系统平台中运行的一个程序,而一个程序中将包含多个线程。
进程:
通常将正在运行的程序成为进程,现在计算机基本都支持多进程操作,比如使用计算机可以边上网,边听音乐,然而计算机上只有一块CPU,实际上,并不能同时运行这些进程,CPU实际上是利用不同时间片段去交替执行每个进程,由于转换速度很快,使人感觉像是在同时运行。
线程:
在一个进程内部也可以执行多任务,可以将进程内部的任务称之为线程,线程是进程中的实体,一个进程可以拥有多个线程。
线程必须拥有父进程,系统没有为线程分配资源,它与进程中的其他线程共享该进程的系统资源。如果一个进程中的多个线程共享相同的内存地址空间,这就意味着这些线程可以访问相同的变量和对象,这让线程之间共享信息变得更容易。
线程的创建:
在Java语言中,线程也是一种对象,但并不是任何对象都可以成为线程,只有实现Runnable接口或者继承了Thread类的对象才能成为线程。以下是线程创建的两种方式:
(一)继承Thread类
1.常用方法:
Thread类中的常用方法包括start()、interrupt()、join()、run()方法等。其中start()和run()方法最常用,start()方法用于启动线程,run()方法为线程的主题方法,读者可以根据需要覆写run()方法。
2.构造方法:
public Thread();//默认构造方法,无参 public Thread(Runnable target);//基于Runable对象的构造方法,将线程的业务逻辑交由参数所传递的Runnable对象去实现 public Thread(ThreadGroup group, Runnable target);//ThreadGroup类表示一组线程,基于Runnable对象和线程分组对象的构造方法 public Thread(String name);//指定线程名称的构造函数,参数name将作为新创建的线程对象的名称 public Thread(ThreadGroup group, String name);//指定线程组别和线程名称 public Thread(Runnable target, String name);//基于Runnable对象并指定线程名称的构造方法 public Thread(ThreadGroup group, Runnable target, String name);//指定线程组别、名称和Runnable对象 public Thread(ThreadGroup group, Runnable target, String name,long stackSize);//指定线程分组、名称、Runnable对象和堆栈大小
3.实例:
在Java语言中要实现线程功能,可以继承java.lang.Thread类,这个类已经具备了创建和运行线程的所有必要架构,通过覆写Thread类中的run()方法,以实现用户所需要的功能,实例化自定义的Thread类,使用start()方法启动线程。
/** * 继承Thread类创建SimpleThread线程类,该类将创建的两个线程<br> * 同时在 控制台输出信息,从而实现两个任务输出信息的交叉显示 */ public class SimpleThread extends Thread { // 构造方法,参数为线程名称 public SimpleThread(String name) { setName(name); } // 覆盖run()方法 public void run() { int i = 0; while (i++ < 5) { try { System.out.println(this.getName() + "执行步骤" + i); sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { SimpleThread thread1 = new SimpleThread("线程1"); SimpleThread thread2 = new SimpleThread("线程2"); thread1.start(); thread2.start(); } }
执行结果
(二)实现Runnable接口
实现Runnable接口的类就可以成为线程,Thread类就是因为实现了Runnable接口所以才具有了线程的功能。Runnable接口只有一个方法就是run()方法,实现Runnable接口后必须覆写run()方法。
public class Thread implements Runnable {} public interface Runnable { public abstract void run(); }
从本质上来讲,Runnable是java语言中用以实现线程的接口,任何实现线程功能的类都必须实现这个接口。Thread类就是因为实现了该接口,所以继承Thread的类才具有了相应的线程功能。
虽然可以使用继承Thread类的方式实现线程,但是由于在java语言中,只能继承一个类,如果用户定义的类已经继承了其他类,就无法再继承Thread类,也就无法使用线程,于是java语言为用户提供了java.lang.Runnable接口,实现这个接口和继承Thread类具有相同的效果在实例化一个Thread对象时,可以传入一个实现Runnable接口的对象作为参数,Thread类会调用Runnable对象的run()方法,继而执行run()方法中的内容。
实例:
/** * 创建SimpleRunnable类,该类实现了Runnable接口,并在run()方法中<br> * 每间隔0.5秒,在控制台输出一个"*"字符,直到输出15个"*"字符。 */ public class SimpleRunnable implements Runnable { // 覆写run()方法 public void run() { int i = 15; while (i-- >= 1) { try { System.out.print("*"); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { Thread thread1 = new Thread(new SimpleRunnable(), "线程1"); thread1.start(); } }
执行结果
本文内容多参考书本知识,随笔记下来学习分享且方便以后查看。
原文地址:https://www.cnblogs.com/maxudong/p/8278194.html