线程池:多个线程封装在一起进行操作。
并发访问的程序包:java.util.concurrent.
对于此线程池的操作的和心累和接口就定义在此包之中。有两个核心的接口:
ExecutorService:普通的执行线程池的接口
ScheduledExecutorService:调度线程池(某些操作可以定时完成)的接口
线程池的创建:Executors类。
1.创建无大小限制的线程池:
2.创建固定大小的线程池:new fix
3.单线程池
4.创建定时调度池
线程池:多个线程封装在一起进行操作。
并发访问的程序包:java.util.concurrent.
对于此线程池的操作的和心累和接口就定义在此包之中。有两个核心的接口:
ExecutorService:普通的执行线程池的接口
ScheduledExecutorService:调度线程池(某些操作可以定时完成)的接口
线程池的创建:Executors类。
1.创建无大小限制的线程池:
2.创建固定大小的线程池:new fix
3.单线程池
4.创建定时调度池
synchronized可以解决同步问题,但不能解决重复操作问题。解决这个问题需要等待和唤醒机制。
sleep()和wait()的区别:
sleep()是Thread类中定义的方法,到了一定时间后该休眠的线程自动唤醒
wait()是Object类中定义的方法,如果要唤醒必须用notify()唤醒。
同步的本质:一个线程等待另外一个线程执行完毕后才可以继续执行,但是如果现在相关的几个线程彼此之间都在等待着(同步),那么就会造成死锁。
所谓的同步指的是所有的线程不是一起进入到方法中执行,而是按照我们的顺序一个一个进来。
如果要想实现这个“锁”,那么可以采用synchronized关键子来进行处理,同步代码块和同步方法。
1.同步代码块:在方法里拦截,进入到方法中的线程依然会有很多个。
2.同步方法:将关键字放到方法上
同步虽然可以保证数据的完整性(线程安全操作),但执行的速度会很慢。
线程的同步和死锁:每一个线程对象操作的轮番抢占资源延迟问题。
不同步的唯一好处是处理速度快(多个线程并发执行)。
使用匿名内部类来实现接口最大的好处是节约了一个文件
面向对象编程要求在于:结构必须非常完整
前提接口里只允许有一个方法
@FunctionalInterface//是一个函数式编程接口,只允许有一个方法
在子类继承接口之后,如果该接口又继续添加方法,则此接口将无法继续使用
1.使用default 来定义普通方法,需要通过对象调用
package num.com;
interface IMessage{
public default void Print(){
System.out.println("Print");
}
public void print();
}
class Message implements IMessage{
public void print(){
System.out.println("print");
}
}
public class TestDemo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Message ms=new Message();
ms.print();
ms.Print();
}
}
2.使用static来定义静态方法,通过接口名就可以调用
接口的子类依然是多继承的关系,而抽象类却是单继承。
package num.com;
interface IMessage{
public default void Print(){
System.out.println("Print");
}
public static IMessage getInstance(){
return new Message();
}
public void print();
}
class Message implements IMessage{
public void print(){
System.out.println("Hello");
}
}
public class TestDemo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
IMessage ms=IMessage.getInstance();
ms.print();
ms.Print();
}
}
压制警告:@SuppressWarning
声明过期处理:@Deprecated
这种过期的处理操作往往出现在一些平台支持的工具上,例如JDK,会不建议用户继续使用了
方法覆写:被覆写的方法不能够拥有比父类更加严格的访问控制权限
@Override在你覆写语法错误时将会提示
1.在软件项目开发过程之中,会将所有使用到的第三方的信息或是程序有关的操作都写在程序里;
如果其中信息发生更改,所要更改的信息量就太大了
2.设置配置文件,程序在运行的时候要通过配置文件读取相关的配置操作
除此之外,配置文件还可能保存一些程序项的内容。
但是改配置文件并不方便
一旦进行修改的时候那么配置文件的数据量的庞大让人晕眩
3.使用注解
使用了注解,但配置文件依然适用,只是少了
枚举只有几个指定的对象进行引用
可以在枚举里面定义属性,方法甚至接口
枚举实现接口,这样枚举中的每个对象就变成了接口对象
构造方法:protected Enum(String name, int ordinal);
取得枚举名字: public final String name();
取得枚举序号:public final int ordinal();
values()可以取得所有的枚举数据:返回枚举数组
enum和Enumd的区别:
enum 是一个关键字,使用enum定义的枚举类本质上就是一个类继承了Enum这个抽象类
线程的优先级:在Thread里面有优先级的方法。
设置优先级和取得优先级。
最高优先级:MAC_PRIORITY 10
中级优先级:NORM_PRIORITY 5
最低优先级:MIN_PRIORITY 1
线程休眠:指的是让我们的线程暂缓一下,等到了预计时间再回复执行。
方法:sleep()用毫秒做单位。
真正进入方法的对象可能有多个,也可能是一个,所以所有的进入代码的顺序可能有差异,延迟可能有差异,但是总体的执行是并发执行。
多线程的操作方法:
线程的命名和取得:多线程的运行状态是不确定的,所以必须有一个可以明确标识出我们线程对象的信息,一般用名称来描述。
1.构造:创建线程的时候设置好名字
2.setName:final不允许子类覆写
3.getName:取得线程名字
必须取得线程对象:所有的操作都在run()方法,取得当前线程对象:currentThread().
JVM是一个进程,所有的主方法只是一个线程,由主线程创造所有的子线程。
Runnable中的run()方法虽然也是线程的主方法,但是很多时候需要一些返回值,这是需要Callable
死锁是由线程竞争资源引起的。