建立多线程方法一: extends Thread方法
步骤:
①、继承Thread方法
②、重写一个run方法
③、在main主线程中执行class对象,调用start方法开始线程。(子类对象.start())
④、缺点:避免OOP单继承局限性
方法二:implements Runnable接口
步骤:
①、继承implements接口
②、重写一个run方法
③、在mian方法中执行class对象,调用Thread对象(Thread(传入对象).start)
④、优点:避免单继承局限性,灵活方便,方便同一对象被多线程使用。
方法三: implements Callable接口(仅作了解即可)
①、继承Callable接口 implements Callable
②、重写call方法 public Boolean call() throws IOException{}
③、//创建执行服务者 ExecutorService ser=Excutor.newFixedThreadpool
④、//提交执行 ser.submit(Callable对象)
⑤、//获取返回值 (返回值类型)接收参数=Callale对象.get();
⑥、//关闭服务 ser.shutdownNow() (奇怪的是为什么会有另外一个方法ser.shutdown?)
②、线程终止
方法 说明
setPriority(int newPriority) 更改线程的优先级
static void sleep(long mills) 在指定的毫秒数内让当前正在执行的线程体休眠
void join() 等待该线程终止
static void yield() 暂停当前正在执行的线程对象,并执行其他线程
void interrupt() 中断线程(不建议使用该方式)
boolean isAlive() 测试线程是否处于活动状态
(不建议使用 stop()方法和interrupt()方法)a
③、Sleep()(解决由于多个对象操作同一个对象所引发的线程不安全问题。Sleep(timemillions 毫秒数)
④、Yield()线程礼让,当前进程放弃占用CPU,让CPU重新进行调度,并且礼让不一定能够成功。
⑤、Join()线程插队,会让线程阻塞,不建议使用。
⑥、State()线程状态观察, State state=thread.getState() state是接收状态类型的变量,thread.getState()是接收当前线程状态的方法。
⑦、setPriority()设置线程的优先级 getPriority()得到线程的优先级
⑧、线程守护机制:daemon()守护线程, Thread.setDaemon();
⑨、线程同步机制:线程锁、线程队列 同步方法:synchronized(隐式锁),作为方法修饰词 同步代码块:synchronized(隐式锁),作为代码块名。
⑩、CopyOnWriteArrayList 并发编程. 在java.until.corrent包下
十一、同步机制名词:死锁、Lock锁、生产者消费者问题、管程法、信号灯法、线程池。
①死锁:多个进程各自占有一些资源、但互相等待对方得资源。
死锁的发生条件为:一、互斥条件:一个资源每次都只能被一个对象使用。二、请求与保持条件:一个请求因为无法得到资源发生阻塞时,保持以获得的资源不放。三、不剥夺条件:进程已获得的资源,在未使用完之前,不强行剥夺。四、若干进程之前形成一种头尾相接的循环等待资源关系。(认为解决死锁,从不剥夺条件上下手。)
②Lock锁:常用的是实现了Lock的ReentrantLock类
③生产者消费者问题:共享一个资源
④管程法:
⑤信号灯法:判断
缺少线程通信的相关知识
⑥线程池(相关方法):
一、创建一个具有缓存功能的线程池,线程将会被缓存在线程中:newCachedThreadPool()
二、创建一个可重用、具有固定线程数的线程池:newfixedThreadPool(int nThread)
三、创建具有延迟功能的线程池:newSchedualedThreadPool(int corePoolsize)
四、创建将大任务分解为多个小任务的线程池:ForkJoinPool()//对于ForkJoinPool(),可以调用.submit()方法提交要执行的target也可以用ForkJoinPool.commonPool()>Futrue<>接收?
五、线程工具类之ThreadLocal类:解决线程并发对资源的非通信共享冲突,
//创建服务,创建线程池
ExecutorService service=Executor.newfixedThreadPool(待填入的线程数);
//执行
service.execute(待放入的线程类)
//关闭线程
service.shutdown()
多核执行任务线程例子:
①、并行线程池的创建: ForkJoinPool forkjoinpool=new ForkJoinPool();
②、向线程池中提交一定的任务: forkjoinpool.submit(待提交的分解成多任务的线程)
③、(未知的方法?)forkjoinpool.awaitTermination(timeout:2,TimeUnit.SECONDS);
④、关闭线程池:forkjoinpool.shutdown();