【目录】
线程
实现线程
死锁
反射
注解
多线程:
在Java思想中,将并发完成的每一件事情称为线程。java语言提供了并发机制,程序猿可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制称为多线程。
一个简单的线程代码
package com.day08.thread;
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("路漫漫其修远今,吾将上下而求索。");
}
}
package com.day08.thread;
public class Test {
public static void main(String[] args) {
//java的主线程
MyThread my = new MyThread();
System.out.println("线程开始执行");
my.start();//在进程中申请独立的运行空间
System.out.println("线程结束执行");
}
}
优势:
系统空转时间减少
共享内存
多个任务同时进行
and so on……
实现多线程的两种方式:
1、继承java.lang.Thread类
public class MyThread extends Thread {
public MyThread() {
}
public MyThread(String name) {
super(name);
}
private static int ticket = 100;//注意将ticket装成静态的才能共享!
private String lock = "asd";
@Override
public void run() {
while (ticket > 0) {
synchronized (lock) {
if (ticket > 0) {
System.out.println(getName() + "卖出了第" + ticket + "张票");
ticket--;
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) {
MyThread m1 = new MyThread("售票员1");
MyThread m2 = new MyThread("售票员2");
MyThread m3 = new MyThread("售票员3");
MyThread m4 = new MyThread("售票员4");
m1.start();
m2.start();
m3.start();
m4.start();
2、实现java.lang.Runnable接口
public class MyRunnable implements Runnable {
private int ticket = 100;
private String s = "lock";// 定义一个锁
@Override
public void run() {
while (ticket > 0) {
synchronized (s) {// 设置锁
if (ticket > 0) {//进来一个,上锁,其它的等待。
//当最后一张卖出,还有要进来的 所以判断票数
System.out.println(Thread.currentThread().getName() + "卖出了票号" + ticket);
ticket--;
}
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread m1 = new Thread(runnable, "售票员1");
Thread m2 = new Thread(runnable, "售票员2");
Thread m3 = new Thread(runnable, "售票员3");
Thread m4 = new Thread(runnable, "售票员4");
m2.setPriority(9);//优先级,在这里让m2优先售票
m1.start();
m2.start();
m3.start();
m4.start();
}
}
死锁
反射
Student类
public class Student {
private int age;
private String name;
private String clazz;
public int getAge() {
return age;
}
// public void setAge(int age) {
// this.age = age;
// }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
}
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
Class<Student> clazz = Student.class;
// //Field[] fields = clazz.getFields();// 以数组形式返回所有公共属性
// Field[] fields = clazz.getDeclaredFields();//以数组形式返回所有属性
// for (Field fie : fields) {
// System.out.println(fie.getName());// 返回属性名称
// System.out.println(fie.getType().getName());// 返回属性的类型名称
// System.out.println(fie.getModifiers());// 反悔属性修饰符的整数形式
// }
Student zhangsan = new Student();
try {
Field age = clazz.getDeclaredField("age");//得到指定名称的属性AGE
age.setAccessible(true);//取消java访问修饰符检查
age.set(zhangsan, 18);//更改对象zhangsan的age属性为18
age.setAccessible(false);//取消检查
System.out.println(zhangsan.getAge());//输出对象zhangsan的age值
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
动态展示反射案例:
注解