大总结:
1: 定义一个类MyThread继承Thread 类。2: 重写run方法 把你想让线程做的内容写在run方法中。3: 在测试中类 创建这个类的对象。4: 不是调用run方法。 而是调用start方法。线程就开启了。
class MyThread extends Thread{@overridepublic void run(){//线程执行内容}
}public class Text{public static void main(String[] args){MyThread mt = new MyThread();mt.start();//线程任务和线程本身耦合性太强}
}
1, 书写简单,方便
2, 线程任务和线程本身耦合在一起了
1: 定义一个类MyRunnable实现Runnable接口2: 在MyRunnable类中重写run()方法3: 创建MyRunnable类的对象4: 创建Thread类的对象,把MyRunnable对象作为构造方法的参数5: 让Thread 的对象调用 start();
class MyRunnable implements Runnable{@overridepublic void run(){//线程执行内容}
}public class Text{public static void main(String[] args){MyRunnable mr = new MyRunnable();Thread t = new Thread(mr);t.start();}
}
1, 书写起来多一步
2, 线程任务和线程本身 相分离
1,定义一个类MyCallable实现Callable接口2,在MyCallable类中重写call()方法3,创建MyCallable类的对象4,创建FutureTask对象,把MyCallable对象作为构造方法的参数5,创建Thread类的对象,把FutureTask对象作为构造方法的参数6,让Thread 的对象调用 start();7,再用FutureTask对象调用get方法,就可以获取线程结束之后的结果。
class MyCallable implements Callable{@overridepublic void call() throws Exception{//线程执行内容return "字符串";}
}
public class Text{public static void main(String[] args){MyCallable mc = new MyCallable();FutureTask ft = new FutureTask(mc);Thread t = new Thread(ft);t.start();String s = ft.get(); //get方法的底层 有等待唤醒机制,然后获取返回值 需要throws一个异常}
}
1,代码复杂
2,可接收线程结束后返回值
1,void setName(String name) 更改此线程的名称2,nameString getName() 获取此线程的名称3,Thread currentThread() 返回对当前正在执行的线程对象的引用4,static void sleep(long millis) 使当前正在执行的线程停留(暂停执行)指定的毫秒数5,final int getPriority() 返回此线程的优先级6,final void setPriority(int newPriority) 更改此线程的优先级线程,默认优先级是5;线程优先级的范围是:1-107,void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
1,是多线程环境2,有共享数据3,有多条语句操作共享数据
synchronized(任意对象) { 多条语句操作共享数据的代码
}
修饰符 synchronized 返回值类型 方法名(方法参数) { 方法体;
}
修饰符 static synchronized 返回值类型 方法名(方法参数) { 方法体;
}//同步静态方法的锁对象是 类名.class
1, 创建ReentrantLock对象Lock lock = new ReentrantLock(); 2, 加锁解锁方法lock.lock();lock.unlock();
1, 资源有限2, 同步嵌套
void wait() 导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法 void notify() 唤醒正在等待对象监视器的单个线程 void notifyAll() 唤醒正在等待对象监视器的所有线程
lockingQueue:ArrayBlockingQueue: 底层是数组,有界LinkedBlockingQueue: 底层是链表,无界.但不是真正的无界,最大为int的最大值
ArrayBlockingQueue
put(anObject): 将参数放入队列,如果放不进去会阻塞take(): 取出第一个数据,取不到会阻塞
NEW : 尚未启动的线程处于此状态。 RUNNABLE :在Java虚拟机中执行的线程处于此状态。 BLOCKED :被阻塞等待监视器锁定的线程处于此状态。 WAITING :正在等待另一个线程执行特定动作的线程处于此状态。 TIMED_WAITING :正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。 TERMINATED :已退出的线程处于此状态。