Java培训教程-java多线程初识

上传人:m**** 文档编号:487540604 上传时间:2022-09-08 格式:DOCX 页数:26 大小:1.10MB
返回 下载 相关 举报
Java培训教程-java多线程初识_第1页
第1页 / 共26页
Java培训教程-java多线程初识_第2页
第2页 / 共26页
Java培训教程-java多线程初识_第3页
第3页 / 共26页
Java培训教程-java多线程初识_第4页
第4页 / 共26页
Java培训教程-java多线程初识_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《Java培训教程-java多线程初识》由会员分享,可在线阅读,更多相关《Java培训教程-java多线程初识(26页珍藏版)》请在金锄头文库上搜索。

1、 http:/本文通过实现多线程的龟兔赛跑、多个用户安全存取一个账户及实现生产者和消费者问题来讲述线程的基础知识、线程控制的常用方法、线程同步知识、线程间通信相关内容。目录入下:一、 线程基础1.1进程与线程1.2线程分类1.3多线程的优势二、 线程控制2.1线程的创建和启动2.2线程的状态2.3线程调度三、 线程同步3.1线程同步的必要性3.2线程同步的实现3.3死锁四、 线程间通信4.1线程间通信的必要性4.2线程间通信的实现一、线程基础1.1进程和线程 程序 程序是一段静态的代码,它是应用程序执行的蓝本 进程 进程是指一种正在运行的程序,有自己的地址空间 进程的特点 动态性 并发性 独立

2、性 线程的定义 进程内部的一个执行单元,它是程序中一个单一的顺序控制流程。如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为多线程 进程是系统资源分配的单位,可包括多个线程 线程是独立调度和分派的基本单位,共享进程资源 引入进程是为了多个程序并发执行,提高资源的利用率和系统吞吐量 引入线程是为了减少程序在并发执行时付出的时空开销1.2线程分类 系统级线程 (核心级线程):由操作系统内核进行管理,使用户程序可以创建、执行、撤销线程 用户级线程 管理过程全部由用户程序完成,操作系统内核只对进程进行管理1.3多线程的优势 多线程使系统空转时间减少,提高CPU利用率 进程间不能共享内存,

3、但线程之间共享内存非常容易 使用多线程实现多任务并发比多进程的效率高 Java语言内置多线程功能支持,简化了Java的多线程编程二、线程控制2.1线程的创建和启动 两种方法来创建线程 继承Java.lang.Thread类,并覆盖run() 方法class MyThread extends Thread public void run( ) /* 覆盖该方法*/ 实现Java.lang.Runnable接口,并实现run() 方法class MyThread implements Runnable public void run( ) /* 实现该方法*/ 启动线程 新建的线程不会自动开始运行

4、,必须通过start( )方法启动 启动继承Thread的线程MyThread t = new MyThread ();t.start(); 启动实现Runnable接口的线程MyThread mt = new MyThread ();Thread t = new Thread(mt); t.start();演示示例:创建和启动多线程1继承Java.lang.Thread类public class ThreadDemo1 public static void main(String args) MyThread1 t = new MyThread1();t.start();while (tru

5、e) System.out.println(兔子领先了,别骄傲);class MyThread1 extends Thread public void run() while (true) System.out.println(乌龟领先了,加油);Java程序启动时,会立刻创建主线程,main就是在这个线程上运行。当不再产生新线程时,程序是单线程的演示示例:创建和启动多线程2 实现Java.lang.Runnable接口public class ThreadDemo2 public static void main(String args) MyThread2 mt = new MyThrea

6、d2();Thread t = new Thread(mt);t.start();while (true) System.out.println(兔子领先了,加油);class MyThread2 implements Runnable public void run() while (true) System.out.println(乌龟超过了,再接再厉); 两种线程创建方式的比较 继承Thread类方式的多线程 优势:编写简单 劣势:无法继承其它父类 实现Runnable接口方式的多线程 优势:可以继承其它类,多线程可共享同一个Thread对象 劣势:编程方式稍微复杂,如果需要访问当前线程

7、,需要调用Thread.currentThread()方法Thread类的常用方法方 法功 能static Thread currentThread()得到当前线程final String getName( )返回线程的名称final void setName(String name)将线程的名称设置为由name指定的名称 void start( ) 调用run( )方法启动线程,开始线程的执行void run( )存放线程体代码2.2线程的状态 新生 使用new关键字创建一个线程后,尚未调用其start方法之前 可运行 调用线程对象的start方法之后 这个状态当中,线程对象可能正在运行,也

8、可能等待运行 阻塞 一种“不可运行”的状态,在得到一个特定的事件之后会返回到可运行状态 死亡 线程的run方法运行完毕或者在运行中出现未捕获的异常时 2.3线程调度 优先级概述 每个线程执行时都具有一定的优先级。当调度线程时,会优先考虑级别高的线程 默认情况下,一个线程继承其父线程的优先级 使用 线程对象.setPriority(p)来改变线程的优先级 优先级影响CPU在线程间切换,切换的原则是: 当一个线程通过显式放弃、睡眠或者阻塞、自愿释放控制权时,所有线程均接受检查而优先级高线程将会优先执行 一个线程可以被一个高优先级的线程抢占资源 同级别的线程之间,则通过控制权的释放,确保所有的线程均

9、有机会运行。 join() 阻塞指定线程等到另一个线程完成以后再继续执行 public class JoinTest extends Thread public JoinTest(String name) super(name);public void run() for (int i = 0; i 5; i+) System.out.println(getName() + + i);public static void main(String args) for (int i = 0; i 10; i+) if (i = 5) JoinTest tempjt = new JoinTest(半

10、路加入的线程);try tempjt.start();tempjt.join(); catch (InterruptedException e) e.printStackTrace();System.out.println(Thread.currentThread().getName()+i);sleep() 使线程停止运行一段时间,将处于阻塞状态 阻塞的时间由指定的毫秒数决定public class TestSleep public static void main(String args) System.out.println(Wait);/ 让主线程等待5秒再执行Wait.bySec(5

11、);/ 提示恢复执行System.out.println(start);class Wait public static void bySec(long s) / sleep s个1秒for (int i = 0; i s; i+) System.out.println(i + 1 + 秒);try / sleep1秒Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace();yield() 让当前正在执行的线程暂停 该方法不会阻塞线程,而是将线程转入可运行状态 public class YeildTest pu

12、blic static void main(String args) TheThread mt = new TheThread();MyNewThread mnt = new MyNewThread();mt.start();mnt.start();class TheThread extends Thread public void run() for (int i = 0; i 5; i+) System.out.println(第一个线程的第 + (i + 1) + 次运行);Thread.yield();class MyNewThread extends Thread public vo

13、id run() for (int i = 0; i 5; i+) System.out.println(第二个线程的第 + (i + 1) + 次运行);Thread.yield();sleep()和yield()对比 sleep()yield()暂停后的状态进入被阻塞的状态,直到经过指定时间后,才进入可运行状态直接将当前线程转入可运行状态没有其他等待运行的线程当前线程会继续等待指定的时间当前线程会马上恢复执行等待线程的优先级别不考虑,机会均等将优先级相同或更高的线程运行setDaemon() 可以将指定的线程设置成后台线程 创建后台线程的线程结束时,后台线程也随之消亡public class DaemonTest extends Thread public void run() while (true) System

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 幼儿/小学教育 > 小学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号