打印流是输出信息最方便的类,注意包含字节打印流PrintStream和字符打印流:PrintWriter。打印流提供了非常方便的打印功能,
可以打印任何类型的数据信息,例如:小数,整数,字符串。
对象的输入输出流的作用: 用于写入对象 的信息和读取对象的信息。 使得对象持久化。
ObjectInputStream : 对象输入流
ObjectOutPutStream :对象输出流
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b。例如,处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。
12.多线程 进程与线程 线程的创建继承Thread类,实现Runnable接口,实现Callable接口
1.继承Thread类
public class ThreadCreateDemo1 { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); //调用start()方法启动线程,线程不一定立即执行,CPU安排调度 } } class MyThread extends Thread {//继承Thread类 @Override public void run() {//重写run()方法,编写线程执行体 super.run(); System.out.println("hellow_world!"); } }2.实现Runnable接口
public class ThreadCreateDemo2 { //创建线程对象,调用start()方法启动线程 public static void main(String[] args) { Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); } } class MyRunnable implements Runnable { public void run() { System.out.println("通过Runnable创建的线程!"); } }上述两种创建方式,工作时性质一样。但是建议使用*实现Runable接口*方式。解决单继承的局限性。
3.实现Callable接口
public class ThreadCreateDemo3 implements Callable<Integer>{ // 实现call方法,作为线程执行体 public Integer call(){ int i = 0; for ( ; i < 100 ; i++ ){ System.out.println(Thread.currentThread().getName()+ "\t" + i); } // call()方法可以有返回值 return i; } public static void main(String[] args) { // 创建Callable对象 ThreadCreateDemo3 myCallableTest = new ThreadCreateDemo3(); // 使用FutureTask来包装Callable对象 FutureTask<Integer> task = new FutureTask<Integer>(myCallableTest); for (int i = 0 ; i < 100 ; i++){ System.out.println(Thread.currentThread().getName()+ " \t" + i); if (i == 20){ // 实质还是以Callable对象来创建、并启动线程 new Thread(task , "callable").start(); } } try{ // 获取线程返回值 System.out.println("callable返回值:" + task.get()); } catch (Exception ex){ ex.printStackTrace(); } } }
实现Callable接口,需要返回值类型
重写call方法,需要抛出异常
创建目标对象
创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
提交执行:Future result1 = ser.submit(t1);
获取结果:boolean r1 = result1.get()
关闭服务:ser.shutdownNow();
总结