会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132843个问题

package com.bjsxt.ObjectLiu;

import java.io.*;

public class TestStudent {
    public static void main(String[] args) {
          //write();//调用写对象的方法
        read();//调用读对象的方法
    }
    public static void write(){
        ObjectOutputStream oos= null;
        try {
            //oos = null;
            oos=new ObjectOutputStream(new FileOutputStream("E:\\student.txt"));
            Student stu=new Student("marry",20,"888888");
            Student.schoolName="JN校区";
            oos.writeObject(stu);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭
            if (oos!=null){
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    public static void read(){
        ObjectInputStream ois= null;
        try {
            ois = null;
            ois=new ObjectInputStream(new FileInputStream("E:\\student.txt"));
            Student stu = (Student) ois.readObject();
            System.out.println(stu);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            //关闭流
            if(ois!=null){
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
//打印结果:Student{name='marry', age=20, pwd='null'}schoolName=null
//杜老师,为什么我的打印结果含有单引号,而讲课的老师的打印结果是没有单引号的,麻烦您帮忙看一下,谢谢您


JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 1996楼

我这个问题是在哪?

/**
 * 账户类
 */
class Account{
    private String accountNum;//账户
    private double balance;//余额

    public Account(){

    }

    public Account(String accountNum, double balance) {
        this.accountNum = accountNum;
        this.balance = balance;
    }

    public String getAccountNum() {
        return accountNum;
    }

    public void setAccountNum(String accountNum) {
        this.accountNum = accountNum;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }
}


class DrawMoney extends Thread{
    private Account account;//账户对象
    private double drawMoney;//取款金额
    public DrawMoney(String name,Account account,double drawMoney){
        super(name);
        this.account=account;
        this.drawMoney=drawMoney;
    }
    /**
     * 取款线程
     */
    @Override
    public void run() {
        if (this.account.getBalance()>=this.drawMoney){
            System.out.println(this.getName()+"取钱成功 "+this.drawMoney);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.account.setBalance(this.account.getBalance()-this.drawMoney);
            System.out.println("\t 余额为:"+this.account.getBalance());
        }else {
            System.out.println(this.getName()+"取钱失败");
        }
    }
}
public class DrawMoneyThread {
    public static void main(String[] args) {
        Account account=new Account("1234",1000);
        new DrawMoney("小王",account,800).start();
        new DrawMoney("李梅",account,500).start();

    }
}

image.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 1998楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 1999楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2000楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 2001楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/反射技术(旧) 2002楼

package cn.sxt.thread2;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 测试练习Lock,实现同步的第三种方式
 * @author User
 *
 */
public class TestLock {
 public static void main(String[] args) {
  /*
  Test2 t2=new Test2();
  new Thread(t2,"A").start();
  new Thread(t2,"B").start();
  new Thread(t2,"C").start();
  */
  
  Test3 t3=new Test3();
  FutureTask ft=new FutureTask(t3);
  new Thread(ft,"A").start();
  new Thread(ft,"B").start();
  new Thread(ft,"C").start();
  
 }
}
class Test2 implements Runnable{
 private int count=0;//默认数
 Lock lock=new ReentrantLock(); //创建锁对象
 @Override
 public void run() {
  for(int a=0;a<10;a++) {
   try {
   lock.lock();//上锁
   count++;
   // TODO Auto-generated method stub
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }   
   System.out.println(Thread.currentThread().getName()+"执行操作:count="+count);
   }finally {
    lock.unlock(); //解锁    
   }
  }
 }
}
class Test3 implements Callable{
 private int count=0;
 Lock lock=new ReentrantLock();//创建锁对象
 @Override
 public Object call() throws Exception {
  for(int a=0;a<10;a++) {
   try {
   lock.lock();
   count++;
   // TODO Auto-generated method stub
   try {
    Thread.sleep(300);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }   
   System.out.println(Thread.currentThread().getName()+"执行操作:count="+count);
   }finally {
    lock.unlock();    
   }  
  }
  return count;
 }
}

image.png

为什么实现Callable 接口使用同步lock的结果和实现Runnablle接口使用同步锁的结果完全不一样?实现Callable接口,得到的结果要么只打印A执行操作,要么只打印B执行操作? 看了几遍课程,老师也没讲到这个。

JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 2005楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/数据结构 2007楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/常用类 2008楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 2009楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637