---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
1、为什么需要线程
线程给程序提供了不同的执行入口,也使得不同的程序可以同时在内存中运行,而不是一定要等一段代码执行完毕之后再执行下一段。这就是为什么需要线程。
2、线程的创建方式;
一种是继承Thread类,另一种是实现Runnable接口,一般使用第二种,因为java只支持单继承,而接口可以实现多个,这就使得类的功能更齐全。第二种创建方式基本都是如下:
new Thread(new XXClass).start(); (XXClass实现了Runnable接口)
3、线程使用中需要注意的问题:
a、同步
当两个线程或两个以上对同一资源进行操作时,就需要对线程进行同步,同步所用的锁必须是同一对象,否则会出现各种乱七八糟的问题,另外同步的代码块或者方法中尽量避免有无需同步的部分。
b、通信
当两个或两个以上线程对统一资源进行不同的操作,而这两种操作还有对立性,比方说一个做面包,一个吃面包,那就得有个机制来判断面包有没有的吃,吃没吃完了。这时候用的就是等待与唤醒机制,有三个方法用在此处:
wai(), notify(), notifyAll()
这些方法都是由锁对象调用,wai() 的作用是让当前持有锁的线程等待,notify()随机唤醒一个在锁的范围里等待的线程,notifyAll()则是唤醒所有;这里面要注意一点就是当有三个线程以上时,判断需不需要等待要用while()语句,唤醒都用notifyAll(),否则会出问题,比如线程全部等待(与死锁现象差不多),还有就是连着做同一个动作。
在JDK1.5以后Lock类使线程的操作更为明朗,更好理解,而且在Lock中可以定义不同的condition来控制线程的唤醒与等待,使其更有目标性,节省内存资源。
c、其他方法
join() 执行该方法语句所在的线程会等待调用该方法的对象线程结束,再与其他线程抢资源运行
interrupt() 将处于冻结状态的线程强制叫醒;被叫醒的线程会抛出一个InterrptedException 异常
setDaemon()将线程设置为守护线程,守护线程除了人为结束之外,会在该线程所在的线程组中所有的非守护线程都结束之后结束。
yield() 这个方法用的很少,就是使当前线程暂停一会,然后执行其他线程;就好像是跑累了坐下来休息一会,让别人跑过去就是了
下面这个代码完全理解了线程就差不多就可以拿来用了
package com.itheima; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 仓库类 * @author Administrator * */ class Resource_1 { private String name; private int count = 1; private boolean flag = false;//这个标记用来判断线程等待与否 private Lock lock = new ReentrantLock();//定义锁 private Condition con = lock.newCondition();//定义一个condition来控制唤醒与等待 /** * 这个方法是制造仓库中的事物 * @param name */ public void set(String name) { lock.lock();//锁上,锁关联的别的线程都稍等 try { while (flag)//用while循环来判断线程是否等待 con.await();//线程等待 this.name = name + "--" + count++; System.out.println(Thread.currentThread().getName() + "。。生产者。。" + this.name); flag = true;//设置属性完毕后改变标签状态 con.signalAll();//叫醒锁关联的所有在等待的线程 } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock();//解锁,锁关联的其他线程有机会抢锁了 } } /** * 这个方法用来消费仓库中的事物 * 代码参照制造部分 */ public void show() { lock.lock(); try { while (!flag) con.await(); System.out.println(Thread.currentThread().getName() + "。。consumer。。" + this.name); flag = false; con.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } /** * 这个类就是调用仓库中制造事物方法的线程类了 * @author Administrator * */ class Producer_2 implements Runnable { private Resource_1 res;//定义仓库,确定操作的目标 /** * 在创建实例对象的同时将仓库地址传进来 * @param res */ public Producer_2(Resource_1 res) { this.res = res; } /** * 开始制造事物了 */ public void run() { while (true) { res.set("商品"); } } } /** * 消费线程 * @author Administrator * */ class Consumer_2 implements Runnable { private Resource_1 res; public Consumer_2(Resource_1 res) { this.res = res; } public void run() { while (true) { res.show(); } } } /** * 主线程 * @author Administrator * */ public class ProducerConsumer_2 { public static void main(String[] args) { Resource_1 res = new Resource_1();//建立仓库 new Thread(new Producer_2(res)).start(); new Thread(new Consumer_2(res)).start(); new Thread(new Consumer_2(res)).start(); new Thread(new Producer_2(res)).start(); } }
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
相关推荐
day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流 day10_缓冲流、转换流、序列化流、Files day11_网络编程 day12_函数式接口 day13_Stream...
NULL 博文链接:https://huangminwen.iteye.com/blog/1157983
4.客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。各类型客户在其...
03-多任务-线程(python和linux高级编程阶段 代码和截图)03-多任务-线程(python和linux高级编程阶段 代码和截图)03-多任务-线程(python和linux高级编程阶段 代码和截图)03-多任务-线程(python和linux高级编程...
NULL 博文链接:https://lvwenwen.iteye.com/blog/1470696
vc++ 多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区
当一个进程中线程有多个时,是多线程。 为什么要用多线程 1,让计算机"同时"做多件事情,节约时间。 2,后台运行程序,提高程序的运行效率.。 3,多线程可以让程序"同时"处理多个事情。 4,...
不多说请看源码,对线程级别控制,对线程的起动/暂停,同时对内存的释放,希望对大家有用
Android----线程实现图片移动 , 运用线程实现图片的水平循环往返移动!
1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...
利用IBM小工具,jca436和jca461来分析线程堆栈,内含使用手册和示例,很详细哟。 首先jps+jmap获取线程堆栈dump,然后利用工具分析具体的表格和ThradDetail
小贝程序员生活\课件\java\java人家\Java第三十七讲总结-线程.doc 小贝程序员生活\课件\java\java人家\Java第三十七讲总结-线程.doc 小贝程序员生活\课件\java\java人家\Java第三十七讲总结-线程.doc
面试知识点总结--线程.pdf
含面向对象,异常处理和常用类,线程技术,集合框架,IO操作,网络编程,文件操作,反射机制,
SYSBIOS系统开发入门-7-3-线程-软件中断.mp4 SYSBIOS系统开发入门-7-3-线程-软件中断.mp4
黑马程序员_张孝祥_Java多线程与并发库,视频+代码+资料
java私塾面试题----线程和JSP及EJB部分1
SYSBIOS系统开发入门-7-1-线程.mp4 SYSBIOS系统开发入门-7-1-线程.mp4 SYSBIOS系统开发入门-7-1-线程.mp4
对Linux下C语言编程--线程操作作了详细的说明
操作系统实验-线程的创建和撤消.pdf