---------------------- 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
相关推荐
总结,"黑马程序员-tomcat集群部署文档资料"涵盖的范围广泛,从基础的集群概念和原理,到具体的Tomcat集群配置和优化,再到高级的源码分析,对于希望提升服务器管理和运维能力的IT从业者来说是一份宝贵的参考资料。...
### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...
Java是世界上最流行的编程语言之一,尤其在...总结来说,"黑马程序员Javase笔记"涵盖了Java的基础语法、内存管理、面向对象编程、集合框架以及泛型和Map等内容,这些都是成为一名合格Java开发者必须掌握的核心知识。
根据提供的信息,我们可以总结出以下关于“中关村黑马程序员训练营Android-4.0视频”的相关知识点: ### 一、概述 “中关村黑马程序员训练营Android-4.0视频”是一套针对Android开发初学者和进阶学习者的培训课程...
含面向对象,异常处理和常用类,线程技术,集合框架,IO操作,网络编程,文件操作,反射机制,
### 黑马程序员入学Java知识(精华总结) #### 一、Java概述与基础知识 ##### 1、何为编程? 编程是指使用计算机语言来编写指令,这些指令被计算机执行以完成特定任务的过程。通过编程,我们可以控制计算机的行为...
程序员编写代码,计算机执行这些代码,最终产生预期的结果。 2. **Java语言的特点**: - **简单性**:Java简化了C++的一些复杂特性,如指针,使得初学者更容易上手。 - **面向对象**:Java强调类和对象,支持封装...
### 黑马程序员Java基础视频辅导班Day01知识点总结 #### Java的跨平台特性与JVM 1. **Java的跨平台性**:Java语言能够实现跨平台运行的关键在于Java虚拟机(JVM),即Java代码可以在任何安装了对应JVM的操作系统上...
"黑马程序员java基础试题、笔记"这个压缩包资源为Java初学者和希望加入"黑马程序员"培训课程的学员提供了丰富的学习材料。这些资源包括面试问题合集、整理的资料、Android面试题、学员入学面试总结、面试技巧、必须...
《黑马程序员面试宝典》是针对Java开发人员的一份综合性的面试准备资料,它涵盖了Java全栈开发中的关键知识点,并且特别强调了在面试中可能会遇到的问题和解答。这份资源包含了一份超过500页的企业面试真题集,旨在...
总结来说,"黑马程序员_毕向东_Java基础源码.rar"为初学者提供了一个深入学习Java编程的宝贵平台。通过学习和实践这些源代码,不仅可以巩固Java基础知识,还能培养良好的编程习惯和思维模式,为成为专业Java开发者...
在【描述】中反复提及“黑马课程最后一个大项目”,这表明它可能是黑马程序员培训机构的一个高级课程项目,用于总结和巩固学员在整个课程中的所学知识。这个项目可能涵盖了从前端界面到后端服务的完整流程,包括用户...
- 爬虫使用多进程还是多线程,取决于具体任务的需求。 4. 反爬虫技术与应对方法 - 如动态网页抓取、验证码识别、代理IP等。 5. 数据库与存储 - 选择合适的数据库存储爬取的数据,例如Mysql、Mongodb、Redis。 ...
【描述】"黑马程序员Java知识精华总结"是一份精心整理的教程,内容广泛且深入,适合那些希望通过系统学习进入Java开发领域的学员。这份资料以清晰易懂的方式讲解了Java的核心概念,确保读者能够理解并应用这些知识。...
"黑马java面试题总结"很可能是一个包含了这些主题的资源包,旨在帮助Java开发者准备面试,提升对技术的理解和应用能力。 首先,Java基础知识是面试中的常考项,包括但不限于语法特性(如封装、继承、多态)、面向...
对于String、StringBuffer和StringBuilder的选择,可以总结为: 1. 操作少量数据时使用String。 2. 单线程下操作大量数据时使用StringBuilder。 3. 多线程下操作大量数据时使用StringBuffer。 以上内容详细解释了...
- 合理利用异步避免阻塞UI线程。 - 压缩传输数据提高加载速度。 - **调试**: - 使用浏览器开发者工具查看网络请求详情。 - 检查JavaScript控制台输出查找错误信息。 - 利用断点调试跟踪执行流程。 #### 九、...