【java基础】( 三 )


多线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--51)(D:\桌面\bug集\扩展\-img\image-.png)]
新建- 可运行状态- 运行状态- 阻塞状态 - 死亡状态
继承、实现、实现
当线程在sleep()状态下,被某个线程调用();方法时会导致在sleep状态下的线程提前醒来
守护线程:是通过普通线程调用(true)设置的 。(守护普通线程、共同死亡)
public void buy(){try {Thread thread = Thread.currentThread();System.out.println(thread.getName()+"挑衣服");Thread.sleep(3000);//同步块使用时需要指定一个同步监视器对象、既:上锁的对象该对象从语法的角度来讲可以是任意引用类型的实例 。但是必须同时满足多个需要同步执行该代码片段的线程看到的是同一个对象才可以synchronized (this){System.out.println(thread.getName()+"试衣服");Thread.sleep(3000);} System.out.println(thread.getName()+"结账走人");} catch (InterruptedException e) {throw new RuntimeException(e);}}锁静态方法一般锁的是类名.class 既:类对象采用继承Thread类方式:(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程 。(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类 。采用实现Runnable接口方式:(1)优点:线程类只是实现了Runable接口,还可以继承其他的类 。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想 。(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法 。Runnable和Callable的区别:(1)Callable规定的方法是call(),Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得(3)call方法可以抛出异常,run方法不可以,因为run方法本身没有抛出异常,所以自定义的线程类在重写run的时候也无法抛出异常(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果 。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果 。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果 。start()和run()的区别start()方法用来,开启线程,但是线程开启后并没有立即执行,他需要获取cpu的执行权才可以执行run()方法是由jvm创建完本地操作系统级线程后回调的方法,不可以手动调用(否则就是普通方法)
线程池(是线程管理机制)
1)复用线程
2)控制线程数量
ExecutorService executorService = Executors.newFixedThreadPool(2);//控制线程数量for (int i = 0; i < 5; i++) {Runnable runnable = new Runnable(){public void run() {Thread thread = Thread.currentThread();System.out.println(thread.getName()+"接任务");try {Thread.sleep(5000);System.out.println(thread.getName()+"一个任务结束了");} catch (InterruptedException e) {e.printStackTrace();}}};executorService.execute(runnable);}/*** shutdown()* 会执行完线程的内容在关闭* shuydownNow()* 强制中断所有线程 来停止线程池*/executorService.shutdown();System.out.println("线程池关闭了");}
集合
System.out.println(Arrays.toString(list.toArray())) //list转数组String[] myArray = { "Apple", "Banana", "Orange" };List myList = Arrays.asList(myArray);//数组转list//迭代器Collection v = new ArrayList<>();v.add("1fdaf");v.add("3adfa");v.add("2dsaf");//迭代器遍历Collection 一般用在超类上核心就是在遍历集合的时候删除某个元素Iterator a = v.iterator();while (a.hasNext()){Object next = a.next();System.out.println(next);}c.forEach(s->System.out.println(s));//jdk8 推出的遍历方式判断空串= 长度==0;空串= "".equals();