- 浏览: 467753 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (272)
- java基础 (59)
- struts (8)
- spring (8)
- 数据库 (8)
- java 网络编程 (29)
- hibernate (3)
- JavaScript (10)
- 日志管理 (2)
- jsp (4)
- servlet (7)
- xml (4)
- ajax (2)
- web service (4)
- 算法与数据结构 (13)
- java 反射机制 (11)
- java 泛型 (3)
- java I/O (8)
- java 线程 (12)
- JavaEE (6)
- java解惑 (33)
- 工具 (5)
- MyEclipse编程实践 (1)
- OSGI (2)
- 设计模式 (9)
- 正则表达式 (0)
- EJB (3)
- Ubuntu linux (6)
- Android (1)
- web前端 (2)
- 找工作 (1)
- SCA (1)
- maven (1)
- 缓存 (1)
- json (1)
- javamail (1)
- 工作笔记 (2)
最新评论
-
霜花似雪:
博主可以分享一下源码吗?
使用maven构建web项目实例 -
王庆波-行:
很好的demo!
memcache使用实例 -
surpassno:
大写的牛逼
java可视化显示内存使用情况 -
zhulin0504:
怎么访问NetEcho.html页面呀???
applet与servlet的网络通信 -
springdata:
java多线程实例demo源代码下载:http://www.z ...
java多线程例子
Map的使用
注意:
IdentityHashMap此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等
2,静态导入方法
System类中的字段有:
static PrintStream err
“标准”错误输出流。
static InputStream in
“标准”输入流。
static PrintStream out
“标准”输出流。
java.lang.Object
java.io.OutputStream
java.io.FilterOutputStream
java.io.PrintStream
3,线程的中断Thread.interrupted
thread. isInterrupted()与Thread.interrupted()
Thread.interrupted()为Thread的静态方法,调用它首先会返回当前线程的中断状态(如果当前线程上调用了interrupt()方法,则返回true,否则为false),然后再清除当前线程的中断状态,即将中断状态设置为false。换句话说,如果连续两次调用该方法,则第二次调用将返回 false。而isInterrupted()方法为实例方法,测试线程是否已经中断,并不会清除当前线程中断状态。
所以这里应该使用isInterrupted()实例方法,就可以修复该问题。
线程问题
执行结果就是:befor...
当一个线程访问一个类的某个成员的时候,它会去检查这个类是否已经被初始化,在这一过程中会有以下四种情况:
1、 这个类尚未被初始化
2、 这个类正在被当前线程初始化:这是对初始化的递归请求,会直接忽略掉(另,请参考《构造器中静态常量的引用问题》一节)
3、 这个类正在被其他线程而不是当前线程初始化:需等待其他线程初始化完成再使用类的Class对象,而不会两个线程都会去初始化一遍(如果这样,那不类会初始化两遍,这显示不合理)
4、 这个类已经被初始化
当主线程调用Lazy.main,它会检查Lazy类是否已经被初始化。此时它并没有被初始化(情况1),所以主线程会记录下当前正在进行的初始化,并开始对这个类进行初始化。这个过程是:主线程会将initial的值设为false,然后在静态块中创建并启动一个初始化initial的线程t,该线程的run方法会将initial设为true,然后主线程会等待t线程执行完毕,此时,问题就来了。
由于t线程将Lazy.initial设为true之前,它也会去检查Lazy类是否已经被初始化。这时,这个类正在被另外一个线程(main线程)进行初始化(情况3)。在这种情况下,当前线程,也就是t线程,会等待Class对象直到初始化完成,可惜的是,那个正在进行初始化工作的main线程,也正在等待t线程的运行结束。因为这两个线程现在正相互等待,形成了死锁。
package other; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; class T { private String str; T(String str) { this.str = str; } public int hashCode() { return 37 * this.str.hashCode(); } public boolean equals(Object obj) { return this.str.equals(((T) obj).str); } public static void put(Map m) { m.put("str", "1"); /* * 由于上面程序将 "str" 放入了字符串常量池, * 所以str是同一个对象,不管是什么样类型的 * Map,即使使用IdentityHashMap都只放入一次 */ m.put("str", "2"); m.put(new T("str"), "3"); m.put(new T("str"), "4"); //这两个T如果用equals比较,相等,所以放入map中,后者替换前者,如果没有重写Object的equals方法,则视为不同 } public static void main(String[] args) { Map m = new HashMap(); put(m); System.out.println("map的大小为:"+m.size());// 2 for(Object key:m.keySet()){ System.out.println(m.get(key));//2,4 } //IdentityHashMap比较时使用==替换equals()方法 m = new IdentityHashMap(); put(m); System.out.println("使用IdentityHashMap,map的大小为:"+m.size());// 3 for(Object key:m.keySet()){ System.out.println(m.get(key));//3,2,4或4,3,2等,map是无序的,即添加数据的顺序和取出数据顺序可能不同 } } }
注意:
IdentityHashMap此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等
2,静态导入方法
package ch7; import static java.util.Arrays.toString; import java.util.Arrays; public class T { public static void main(String[] args) { prt(1, 2, 3); } static void prt(Object... args) { // 自身继承至Object类的toString的优先级高于静态导入的方法 // System.out.println(toString(args));//不能编译,Object类中的toString方法没有参数,所以出现compile error System.out.println(Arrays.toString(args)); //[1,2,3] } }
System类中的字段有:
static PrintStream err
“标准”错误输出流。
static InputStream in
“标准”输入流。
static PrintStream out
“标准”输出流。
java.lang.Object
java.io.OutputStream
java.io.FilterOutputStream
java.io.PrintStream
package ch7; import static java.util.Arrays.toString; import java.util.Arrays; public class T { public static void main(String[] args) { prt(1, 2, 3); String str = "Hello World"; for (int i = 0; i < str.length(); i++) { //不会输出 System.out.write(str.charAt(i)); } System.out.flush(); //刷新缓冲区才会输出out流中的数据????????? } }
3,线程的中断Thread.interrupted
thread. isInterrupted()与Thread.interrupted()
public class SelfInerruption { public static void main(String[] args) { Thread.currentThread().interrupt(); if (Thread.interrupted()) { // Interruped:false System.out.println("Interruped:" + Thread.interrupted()); } else { System.out.println("Not interruped:" + Thread.interrupted()); } } }
Thread.interrupted()为Thread的静态方法,调用它首先会返回当前线程的中断状态(如果当前线程上调用了interrupt()方法,则返回true,否则为false),然后再清除当前线程的中断状态,即将中断状态设置为false。换句话说,如果连续两次调用该方法,则第二次调用将返回 false。而isInterrupted()方法为实例方法,测试线程是否已经中断,并不会清除当前线程中断状态。
所以这里应该使用isInterrupted()实例方法,就可以修复该问题。
package other; public class SelfInerruption { public static void main(String[] args) { Thread t = Thread.currentThread(); System.out.println(t.getName()); //main t.interrupt(); //中断 if (t.interrupted()) { // 是静态方法,建议不要这么调用,当前线程被中断,所以为true System.out.println("Interruped:" + t.interrupted()); //Interruped:false,再次调用interrupted(),返回为false } else { System.out.println("Not interruped:" + t.interrupted()); } } }
线程问题
package other; //类的初始化,先初始化静态域,静态块, public class Lazy { private static boolean initial = false; static { Thread t = new Thread(new Runnable() { public void run() { System.out.println("befor...");//此句会输出 /* * 由于使用Lazy.initial静态成员,又因为Lazy还未 初 * 始化完成,所以该线程会在这里等待主线程初始化完成 */ initial = true; System.out.println("after...");//此句不会输出 } }); t.start(); try { t.join();// 主线程等待t线程结束 } catch (InterruptedException e) { e.printStackTrace(); } }//static public static void main(String[] args) { System.out.println(initial); } }
执行结果就是:befor...
当一个线程访问一个类的某个成员的时候,它会去检查这个类是否已经被初始化,在这一过程中会有以下四种情况:
1、 这个类尚未被初始化
2、 这个类正在被当前线程初始化:这是对初始化的递归请求,会直接忽略掉(另,请参考《构造器中静态常量的引用问题》一节)
3、 这个类正在被其他线程而不是当前线程初始化:需等待其他线程初始化完成再使用类的Class对象,而不会两个线程都会去初始化一遍(如果这样,那不类会初始化两遍,这显示不合理)
4、 这个类已经被初始化
当主线程调用Lazy.main,它会检查Lazy类是否已经被初始化。此时它并没有被初始化(情况1),所以主线程会记录下当前正在进行的初始化,并开始对这个类进行初始化。这个过程是:主线程会将initial的值设为false,然后在静态块中创建并启动一个初始化initial的线程t,该线程的run方法会将initial设为true,然后主线程会等待t线程执行完毕,此时,问题就来了。
由于t线程将Lazy.initial设为true之前,它也会去检查Lazy类是否已经被初始化。这时,这个类正在被另外一个线程(main线程)进行初始化(情况3)。在这种情况下,当前线程,也就是t线程,会等待Class对象直到初始化完成,可惜的是,那个正在进行初始化工作的main线程,也正在等待t线程的运行结束。因为这两个线程现在正相互等待,形成了死锁。
发表评论
-
数据库及struts面试题
2011-06-22 11:07 1060数据库部分 Q: What is SQL? ... -
EJB面试题
2011-06-22 10:54 1125Q: What are the different kinds ... -
java中的servlet面试题
2011-06-22 10:43 1110Q: Explain the life cycle metho ... -
java中JSP的面试题
2011-06-22 10:22 1544Q: What is a output comment? (可 ... -
java中的集合面试题
2011-06-22 10:12 721Q: What is the Collections API? ... -
彻底搞清楚java的内部类
2011-06-15 10:47 1507内部类允许在一个类中 ... -
细说java(java中的浮点数十六进制表示)
2011-06-12 16:48 3566java中浮点数不能用八进制表示,但可以用十六进制表示,只能用 ... -
SCJP试题
2011-06-09 16:14 1179package scjp; public class T ... -
java面试题解惑 之 继承、多态、重载、重写
2011-06-03 09:36 1301继承、多态、重载、重写 继承 java中有三种类:类,抽象类, ... -
java面试题解惑 之 多线程
2011-06-02 17:24 9921,多线程 线程或者说 ... -
java面试题解惑 之变量初始顺序,变量覆盖,字符串池,final,finally区别
2011-06-02 16:26 7991,变量初始化顺序 package com.qdu.sun; ... -
java 继承的一个问题(想不明白)
2011-04-13 17:03 916java中的继承问题,以为是学会了java,结果最简单的一个j ... -
java解惑(谜题76。。)
2011-03-09 11:22 1221谜题76:乒乓public class PingPong { ... -
java解惑(谜题60,65)
2011-03-08 15:52 919一行以毙之 1,编写一个 ... -
java解惑(谜题66。。。)
2011-02-28 20:54 956谜题66:一件私事 class Base{ public ... -
java解惑(谜题61。。。)
2011-02-28 20:17 916谜题61:日期游戏 import java.util.Cal ... -
java解惑(谜题56到。。库之谜)
2011-02-28 19:41 860谜题56:大问题 import jav ... -
java解惑(谜题49。。)
2011-02-27 10:52 954谜题49:比生命更大 import java.util.Cal ... -
java解惑(谜题41到谜题)
2011-02-27 10:18 922谜题41:域和流 下面的 ... -
谜题36-谜题
2011-02-25 10:55 902谜题36:优柔寡断 public ...
相关推荐
interrupted 方法也用于检查线程的中断状态标志,但与 isInterrupted 方法不同的是,interrupted 方法不仅检查中断状态标志,还会清除该标志位。 在 JDK 库的源代码中,interrupted 方法经常被使用,因为它可以同时...
9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...
Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程...interrupted 方法可以判断是否被中断,静态方法 interrupted() 则可以判断是否被中断,并清除当前中断状态。需要根据中断标志位手动处理线程中断。
在Java多线程编程中,中断机制是一种优雅的线程停止策略,相比已废弃的`stop()`方法,中断机制提供了更安全、可控的方式来结束线程的执行。本文将深入探讨`stop()`, `interrupted()`以及`isInterrupted()`这三个方法...
- `interrupt()`方法用于中断线程,但这并不意味着线程会立即停止,而是设置中断标志,线程需在适当位置检查`isInterrupted()`或`interrupted()`方法来响应中断。 - 守护线程(Daemon Thread)是一种后台线程,当...
在《java线程与并发实践编程》中,作者Jeff Friesen可能还会深入讨论线程池的配置策略、死锁和活锁的预防、线程性能分析与调优,以及Java内存模型(JMM)和线程通信模型(如wait()、notify()、notifyAll())等内容。...
在 Java 中,线程的interrupted 状态可以通过 isInterrupted 方法判断。如果线程的 interrupted 状态为 true,那么它将被中断。在被中断后,线程将抛出 InterruptedException。 在 Java 中,线程的 join 方法可以让...
本文将深入探讨Java多线程的详细知识,包括线程的创建、同步与通信、线程状态以及相关API的使用。 1. **线程的创建** - **实现Runnable接口**:这是创建线程的常见方式,通过实现Runnable接口并重写run()方法,...
推荐使用interrupt()方法来中断线程,并在run()方法中检查isInterrupted()或interrupted()状态,以优雅地退出线程。 六、线程池 Java提供ExecutorService和ThreadPoolExecutor等工具类来管理线程池,可以有效地复用...
3. **检查中断状态**:线程可以通过`Thread.interrupted()`静态方法检查当前线程是否已被中断,该方法会清除中断标志。非静态的`isInterrupted()`方法则只用于检查中断状态,不会清除标志。 4. **...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在面试中,对Java多线程的理解和熟练运用往往成为衡量开发者技能水平的重要标准。以下是对Java多线程面试题59题集合中可能涉及的...
1. **中断状态的检查与清除**:在处理中断时,需要定期检查线程的中断状态,并在必要时使用`Thread.interrupted()`方法清除中断状态。这是因为`Thread.interrupted()`会清除当前线程的中断状态,而`Thread....
本资源“Java Thread Programming (Sams)”提供了详细的线程编程知识,结合了理论与实际代码,旨在帮助开发者深入理解并熟练掌握Java线程。 1. **线程概念** - 线程是操作系统调度的基本单位,一个进程可以包含多...
9. **线程中断**:通过`interrupt()`方法设置线程的中断标志,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求。 10. **线程Local变量**:`ThreadLocal`类为每个线程提供独立的变量副本,...
"Java多线程中断机制三种方法及示例" Java多线程中断机制是Java编程语言中一个重要的概念,涉及到线程的生命周期和线程的协作机制。中断机制是一种协作机制,通过中断并不能直接终止另一个线程,而需要被中断的线程...
Java提供了wait()、notify()和notifyAll()方法进行线程间的通信,但这需要在同步控制块(synchronized)中使用。Java 5引入了BlockingQueue阻塞队列,提供了一种更安全的线程间通信方式,如ArrayBlockingQueue、...
9. **中断线程**:线程的`interrupt()`方法用来请求线程中断,而`isInterrupted()`和`interrupted()`方法用于检查中断状态。需要注意的是,`interrupt()`方法不会立即停止线程,而是设置中断标志,需要在`run()`方法...
从给定的文件信息中,我们可以提取出关于Java多线程编程的重要知识点,涉及线程创建、线程生命周期以及线程间的同步与通信等核心概念。 ### Java多线程编程实例解析 #### 1. 创建线程的方式 在Java中,创建线程有...
- **isInterrupted()和interrupted()**:检查线程是否被中断,前者是非静态方法,后者是静态方法。 4. **线程同步和通信**: - **synchronized**:用于控制并发访问共享资源,防止数据不一致。 - **wait(), ...
3. 线程中断:通过调用Thread类的interrupt()方法可以中断线程,线程可以通过检查isInterrupted()或interrupted()方法来响应中断请求。 四、线程状态 Java线程有五种基本状态:新建(New)、就绪(Runnable)、...