//线程中断,
public class TestDemo3 {
public static void main(String[] args) {
final Thread thread1=new Thread(){
public void run(){
while(true){
System.out.println("去睡觉了,5000毫秒之后见");
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
System.out.println("终止当前线程");
break;
}
}
}
};
Thread thread2=new Thread(){
public void run(){
for(int i=0;i<=12;i++){
System.out.println("thread2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("thread2执行了12秒了");
thread1.interrupt();
}
};
thread1.start();
thread2.start();
}
}
Thread
反射
知识点
1 两种方式创建线程
1)继承Thread类
a 继承Thread类, 覆盖run()方法, 提供并发运程的过程
b 创建这个类的实例
c 使用start() 方法启动线程
2)实现Runnable接口
a 实现Runnable接口, 实现run()方法, 提供并发运程的过程
b 创建这个类的实例, 用这个实例作为Thread构造器参数
创建Thread类.
c 使用start() 方法启动线程
class Foo implements Runnable{
public void run(){
//....
}
}
Thread t = new Thread(new Foo());
t.start(); //扩展性比较好
3)使用 内部类/匿名类 创建线程
案例: thread2.Demo1
public abstract interface java.lang.Runnable {
// Method descriptor #1 ()V
public abstract void run();
}
2 Sleep 的打断唤醒
1) Thread.sleep(times) 使当前线程从 Running 放弃处理器
进入Block状态, 休眠times毫秒, 再返回到Runnable
2)一个线程可以提前唤醒另外一个sleep Block的线程
interrupt() 打断/中断
3) 被唤醒线程出现 中断异常
3 异步, 同步
1) 异步: 并发, 各干自己的: 如: 一群人上卡车
2) 同步: 步调一致的处理, 如: 一群人上公交车
案例: thread2.Demo5
4) 案例异步写文件
1) 一个线程负责将控制台信息读取到LinkedList
如果控制台输入quit 将结束输入. 中断写出线程
2) 一个线程负责将LinkedList的信息写到test2.txt
每次检查LinkedList是否有数据, 如果有就写出, 直到空为止
如果没有数据就休眠5秒
写出线程是后台线程, 可以自动结束
线性并发安全问题
案例: thread2.Demo7
1) 多个线程并发读写同一个临界资源时候会发生"
线程并发安全问题"
2) 常见的临界资源:
多线程共享实例变量
静态公共变量
3) 使用同步代码块解决线程并发安全问题
synchronized(同步监视器){
}
a 同步监视器 是一个任意对象实例. 是一个多个线程之间的互
斥的锁机制. 多个线程要使用同一个"监视器"对象 实现同步互斥
b 常见写法:
synchronized(this){
// 把当前的资源跟当前访问的线程绑定在一起
}
c 如果方法的全部过程需要同步, 可以简单使用 synchronized
修饰方法. 相当于整个方法的 synchronized(this)
d 尽量减少同步范围, 提高并发效率
Java 反射
1) 反射是Java自我管理(类, 对象)的机制
2) * 可以通过反射机制发现对象的类型 发现类型的方法/属性/
构造器
3) * Java 反射 可以创建对象并访问任意对象方法和属性等
类 Class<T>
java.lang.Object
java.lang.Class<T>
类型参数:
T - 由此 Class 对象建模的类的类型。例如,
String.class 的类型是 Class<String>。
如果将被建模的类未知,则使用 Class<?>。
int a;
Person p;
类型 变量;
类的类型 class对象
Class<Person> type = Person.class;
1) 创建对象的时候:
a Person p = new Person();
b 利用反射来创建对象(3种,前两种必须知道)
案例: ref1.Demo8
//1 第1种
// 1)先创建class对象
Class<?> type = Person.class;//创建Class对象type
// 2)type.newInstance():通过type来创建Preson对象
Person person2 = (Person)type.newInstance();
System.out.println("通过反射来创建Person对象"+person2);
//2 第2种:根据类的包名.类名来创建class对象
Class<?> type2 = Class.forName("ref1.Person");
Person person3 = (Person) type2.newInstance();
System.out.println(person3);
//3 第3种:对象名.getClass()也可以获得class对象
Class<?> type3 = person.getClass();
Person person4 = (Person) type3.newInstance();
System.out.println(person4);
2) Class 加载
类加载到内存: java 将磁盘类文件加载到内存中,为一个
对象(实例)这个对象是Class的实例,也就是 这些对象都是
Class实例
3) 带参数构造方法如何创建对象?
5)Class 实例代表Java中类型,
基本类型的类型: int.class, long.class
类类型 Class 实例获得如下:
Class cls = String.class;
Class cls = Class.forName("java.lang.String");
Class cls = "abc".getClass();
以上方法获得cls 是同一个对象, 就是String 类内存加载的结果