第一范文网 - 专业文章范例文档资料分享平台

java中线程与多线程快速入门

来源:用户分享 时间:2025/5/23 7:48:24 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操作系统而言其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务

创建线程:

① 线程类继承Thread,重写run()方法,在run()方法中完成此线程所要完成的工作,

直接创建线程类的对象,然后调用start()方法启动线程,默认调用run()方法 ② 线程类实现Runnable接口,实现run()方法,在run()方法中完成此线程所要完成的

工作;创建线程的时候要注意:

首先创建线程类的对象t,然后通过Thread tt = new Thread(t);来创建线程tt。也是通过调用start()方法来启动线程。

要想创建一个线程类,实质上是必须实现Runnable接口,因为Thread本身也是实现了Runnable接口的。但是如果要调用start()方法来启动一个线程,就必须构建Thread类的对象:如果是用第①中方式创建的线程类,那么他所创建的对象就可以隐式转换成Thread对象,所以可以直接调用start()方法;如果使用第②种方式创建的线程类,那么使用这个线程类创建对象之后,还必须通过这个对象创建一个Thread类的对象。

守护线程: 如何设置成守护线程:setDeamon() 守护线程一般用来为其他的线程提供服务,当其他的线程全部执行完毕以后,无论守护线程是否执行完成都会自动终止。

线程优先级: 优先级范围:1—10 设置线程t优先级的方法:t.setPriority(1--10)

获取线程t优先级的方法:t.getPriority() 线程优先级的默认值是:5 线程优先级为10的优先级最高,为1的最低

Join()方法:

以A,B两个线程为例:如果在线程A中调用B.join()方法,表示让线程A处于等待状态,直到线程B执行结束后才接着执行

Sleep()方法: Sleep()方法时让当前线程处于等待状态,等待时间由参数决定 Sleep()方法的调用形式:Thread.thread(时间毫秒数);

线程的状态: 线程有五种状态:新生状态,可运行状态,运行状态,阻塞状态和运行结束状态。 当一个线程类在创建了对象之后,就意味这一个线程的产生,在调用start()方法之前为“新生状态”,调用start()方法让线程进入“可运行状态Runnable”,此时的线程可以被线程管理器调度;一旦线程调度(获取到时间片)即从可运行状态进入到“运行状态Running”;

在运行过程中遇到阻塞事件(如:sleep(),wait(),锁等待??)便使线程变成了“阻塞状态Blocked”;直到阻塞事件消除(如:notify(),锁释放??)线程有由阻塞状态变回“可运行状态”;当线程执行结束则为“结束状态”。 Wait()方法: 使当前线程进入阻塞状态,直到有notify()方法或者notifyAll()方法唤醒 Notify()方法: 唤醒一个由于wait()方法处于等待的线程 NotifyAll()方法:

唤醒所有由于wait()方法处于等待的线程

12.2 创建线程

在Java中,线程也是一种对象,但并非任何对象都可以称为一个线程,只有实现了Runnable接口的类的对象才有资格成为线程,即实现Runnable接口是对象转变为线程的一个必要条件。

public interface Runnable { } //\字典定义为:可运行的 public void run(); Runnable接口是一个非常简单的接口,它仅包含一个抽象的run()方法。但是,只有实现了Runnable接口的类的对象才能成为线程。 创建线程的方法如下: Thread t = new Thread(runnable 对象); runnable对象是指实现了Runnable接口的类的对象,线程执行时,runnable对象的run()方法会被调用执行。 如果想运行上面创建的线程t,还需要调用Thread的start()方法:t.start();

【示例】这一示例演示了创建并启动线程的方法。 class Runner1 implements Runnable { // 1.Runner1实现Runnable接口 } public class Thread1 { public static void main(String[] args) { } Runner1 r = new Runner1(); // 2.创建实现Runnable接口的对象 Thread t = new Thread(r); // 3.创建一个Thread类的对象 t.start(); // 4.启动线程 public void run() { } for (int i = 1; i < 20; i++) { } System.out.println(i);

} 程序运行的结果是输出1到19个数字。与在main()方法中直接写for循环是一样的效果,但实现的原理不一样。使用线程输出的有两个线程(main()主线程和t子线程),不使用只有一个线程。

创建线程的步骤:

1.定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。

2.创建Runnable接口实现类的对象。

3.创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)

4.调用Thread对象的start()方法,启动线程

创建线程的另一种方法

事实上,Thread类本身也实现了Runnable接口。所以我们可以构建一个类,让它继承Thread类,并覆盖集成而来的run()方法,通过创建这个类的对象,从而创建一个线程。

【示例】这一示例演示了通过继承Thread类创建并启动线程的方法。

public class Thread2 { } class Runner2 extends Thread { } public void run() { } for (int i = 1; i < 20; i++) { } String s = Thread.currentThread().getName(); System.out.println(s + \ + i); public static void main(String[] args) { } Thread t = new Runner2(); t.start(); 通过继承Thread类创建并启动线程步骤:

1.首先定义一个类去继承Thread父类,此时Runner2类并没有直接的实现Runnable接口,但其实Thread类在JDK中已经实现了Runnable接口。这样就Runner2类间接的实现了Runnable接口。重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。

2.直接创建一个Runner2类的对象,也可以利用多态性,变量t声明为父类的类型。 3.线程t启动,隐含的调用run()方法。

比较两种线程的创建方式: a.使用Runnable接口创建线程

1.可以将CPU,代码和数据分开,形成清晰的模型

2.线程体run()方法所在的类可以从其它类中继承一些有用的属性和方法 3.有利于保持程序的设计风格一致 b.直接继承Thread类创建对象

1.Thread子类无法再从其它类继承(java语言的单继承)。

2.编写简单,run()方法的当前对象就是线程对象,可直接操作。

12.3 多线程

如果我们同时启动多个线程,这些线程就会在CPU上按照启动顺序在给定的时间内轮流执行。请看下面一个示例:

class MyThread extends Thread { } public class Thread3 { } public static void main(String[] args) { } Thread mt1 = new MyThread(); Thread mt2 = new MyThread(); mt1.start(); //x1 Thread-0 mt2.start(); //x2 Thread-1 public void run() { } for (int i = 1; i <= 10; i++) System.out.println(super.getName() + \ + i); 运行结果: Thread-0:1 Thread-1:1 Thread-0:2 Thread-0:3 Thread-1:2 Thread-1:3 Thread-1:4 ?? Thread-0:5 Thread-0:6 Thread-0:7 Thread-0:8 Thread-0:9 Thread-0:10 x1行和x2行语句分别启动了两个线程,线程mt1与mt2的run()方法会轮流换行。你多次运行上面的这个示例就会发现,程序每次运行的结果都是不相同的,这是因为线程的执行时间和顺序都是由Thread Scheduler负责管理的。 通过多线程机制,我们可以将复杂的任务分解成若干个小任务分别执行它们。 下面这个示例是一个用于求取1~1000之和的程序,它具体分为两个线程,一个用于求取1~500的和,另一个则用来求取501~1000的和。SumThread类请参照前面的示例。

public class SumThread extends Thread { int from, to; long sum; public SumThread(int from, int to) { } public long getSum() { } public void run() { } for (int i = from; i <= to; i++) { } sum += i; return sum; this.from = from; this.to = to;

搜索更多关于: java中线程与多线程快速入门 的文档
java中线程与多线程快速入门.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c3pjpt6zf2i4qfr016rq7_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top