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

打印出来为什么是字母隔断两个呢?逻辑有问题?

Printer:

package cn.sxt.thread;

public class Printer {
	private  int index=1;
	public  synchronized void print(int number) throws InterruptedException{
		if(index%3==0){
			super.wait();			
		}else{			
			System.out.println(number);
			super.notifyAll();
			index++;
	}
		
	}
	public  synchronized void print(char ch) throws InterruptedException{
		if(index%3!=0){
			super.wait();
		}else{
			System.out.println(ch);
			super.notifyAll();
			index++;
		}
	}

}

CharPrinter:

package cn.sxt.thread;

public class CharPrinter implements Runnable {
	private Printer printer;
	public CharPrinter(Printer printer){
		this.printer=printer;
	}
	@Override
	public void run() {
		for(char i='A';i<='Z';i++){
			try {
				printer.print(i);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	

}

NumberPrinter :

package cn.sxt.thread;

public class NumberPrinter implements Runnable {
	private Printer printer;
	public NumberPrinter(Printer printer){
		this.printer=printer;
	}

	@Override
	public void run() {
		for(int i=1;i<=52;i++){
			try {
				printer.print(i);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
	}

}

TestThread

package cn.sxt.thread;

public class TestThread {
	public static void main(String[] args){
		Printer p = new Printer();
		NumberPrinter np = new NumberPrinter(p);
		CharPrinter cp = new CharPrinter(p);
		Thread t1 = new Thread(np);
		Thread t2 = new Thread(cp);
		t1.start();
		t2.start();
	}

}

image.png

MyNewThread.rar


JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 3181楼

//老师,如果在Account类中重写equals方法,使得当accountNo相同的情况下判定为同一对象
那为什么线程同步没有进行互斥呢

import java.util.Objects;

class Account {
    private String accountNo;
    private double balance;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Account account = (Account) o;
        return Double.compare(account.balance, balance) == 0 && Objects.equals(accountNo, account.accountNo);
    }

    @Override
    public int hashCode() {
        return Objects.hash(accountNo, balance);
    }

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

    public Account() {
    }

    public String getAccountNo() {
        return accountNo;
    }

    public void setAccountNo(String accountNo) {
        this.accountNo = accountNo;
    }

    public double getBalance() {
        return balance;
    }

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

class DrawThread extends Thread {
    //账户对象
    private Account account;
    private double drawMoney;

    public DrawThread(String Name, Account account, double drawMoney) {
        super(Name);
        this.account = account;
        this.drawMoney = drawMoney;
    }

    @Override
    public void run() {
        synchronized (this.account){
            //判断当前账户余额是否大于或等于取款金额
            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("当前余额为:" + this.account.getBalance());
            } else {
                System.out.println(this.getName() + "取款失败,余额不足");
            }
        }
    }
}

public class DrawMoneyDemo {
    public static void main(String[] args) {
        Account account = new Account("1001", 1000);
        Account account1 = new Account("1001", 1000);
        System.out.println(account1.equals(account));
        new DrawThread("老公", account, 800).start();
        new DrawThread("老妞", account1, 800).start();
    }
}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 3184楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 3185楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 3186楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 3187楼

老师,我照着视频敲的,这个怎么解决?

image.png

源码

package com.bjsxt.server;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class WebDom4j { //用于解析XML
    private List<Entity> entityList; //用于存储N多Entity,而每一个Entity都是servlet-name和servlet-class
    private List<Mapping> mappingList; //用于存储N多Mapping,而每一个Mapping都是一个servlet-name和N多个url-pattern

    public List<Entity> getEntityList() {
        return entityList;
    }

    public void setEntityList(List<Entity> entityList) {
        this.entityList = entityList;
    }

    public List<Mapping> getMappingList() {
        return mappingList;
    }

    public void setMappingList(List<Mapping> mappingList) {
        this.mappingList = mappingList;
    }

    public WebDom4j() {
        entityList = new ArrayList<Entity>();
        mappingList = new ArrayList<Mapping>();
    }
    public Document getDocument(){
        try {
            //(1)创建SAXReader对象
            SAXReader reader = new SAXReader();
            //(1)调用reader方法
            return reader.read(new File("D:\\MyCode\\IdeaProjects\\firstPreject\\http_server2\\src\\WEB_INFO\\web.xml"));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return null;
    }
    public void parse(Document doc){
        //获取根元素
        Element root = doc.getRootElement(); //web-app
        //获取servlet子元素
        for (Iterator<Element> ite =  root.elementIterator("servlet");ite.hasNext();){
            Element subElement = ite.next(); //得到每一个servlet
            //创建一个实体类Entity
            Entity ent = new Entity(); //用于存储servlet-name和servlet-class
            for (Iterator<Element> subIte = subElement.elementIterator();subIte.hasNext();){
                Element ele = subIte.next(); //可能是servlet-name,也可能是servlet-class
                if ("servlet-name".equals(ele.getName())){
                    ent.setName(ele.getText()); //给实体类中的name赋值
                }else if ("servlet-class".equals(ele.getName())){
                    ent.setClazz(ele.getText()); //给实体类中的clazz赋值
                }
                //将Entity添加到集合中
                entityList.add(ent);
                for (Entity entity: entityList
                     ) {
                    System.out.println(entity.getName() + "\t" +entity.getClazz());
                }
            }
        }
    }
    //测试
    public static void main(String[] args) {
        WebDom4j web = new WebDom4j();
        web.parse(web.getDocument());
    }
}

image.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 3189楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 3191楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO流技术 3192楼

2020 12 20 21:10----------------------

package com.bjsxt.dom;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestDOMParse {
   public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
      // 1) 创建一个DocumentBuilderFactory的对象
      DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
      // 2) 创建一个DocumentBuilder对象
      DocumentBuilder db=dbf.newDocumentBuilder();
      // 3) 通过DocumentBuilder的parse(...)方法得到Document对象
      Document doc=db.parse("book.xml");
      // 4) 通过getElementsByTagName(...)方法获取到节点的列表
      NodeList bookList=doc.getElementsByTagName("book");
      //System.out.println(bookList.getLength());
      // 5) 通过for循环遍历每一个节点
      for(int i=0;i<bookList.getLength();i++){
         //6)   得到每个节点的属性和属性值
         Node book=bookList.item(i);
         NamedNodeMap attrs=book.getAttributes(); //得到了属性的集合
         //循环遍历每一个属性
         for(int j=0;j<attrs.getLength();j++){
            //得到每一个属性
            Node id=attrs.item(j);
            System.out.println("属性的名称:"+id.getNodeName()+"\t"+id.getNodeValue());
         }
      }
      System.out.println("\n每个节点的名和节点的值");
//    7) 得到每个节点的节点名和节点值
      for(int i=0;i<bookList.getLength();i++){
         //得到每一个book节点
         Node book=bookList.item(i);
         NodeList subNode=book.getChildNodes();
         System.out.println("子节点的个数:"+subNode.getLength());
         //使用for循环遍历每一book的子节点
         for(int j=0;j<subNode.getLength();j++){
            Node childNode=subNode.item(j);
            //System.out.println(childNode.getNodeName());
            short type=childNode.getNodeType(); //获取节点的类型
            if(type==Node.ELEMENT_NODE){
               System.out.println("节点的名称:"+childNode.getNodeName()+"\t"+childNode.getTextContent());
            }

         }
      }

   }
}
<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book id="1001">
      <name>java开发实战</name>
      <author>张小三</author>
      <price>98.5</price>
   </book>
   <book id="1002">
      <name>mysql从删库到跑路</name>
      <author>王一一</author>
      <price>89.7</price>
   </book>
</books>

YO)FESE6C}X8$OM($`SPYUU.png

7个节点是7个?


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

老师,通过比较器实现比较规则这个显示下面这一行

Map<Student,String> treeMap = new TreeMap<>(new StudentComparator());

出了问题,能帮我看一下是什么问题吗?

package 双例集合;

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * 元素自身实现比较规则   TreeMap可以对键进行排序
 */
public class TreeMapTest {
    public static void main(String[] args) {
        //实例化TreeMap
        Map<Users,String> map = new TreeMap<>();
        //创建User对象
        Users u1 = new Users("liu",18);
        Users u2 = new Users("admin",20);
        Users u3 = new Users("sxt",20);
        map.put(u1,"liu");
        map.put(u2,"admin");
        map.put(u3,"sxt");
        Set<Users> keys = map.keySet();
        for (Users key:keys){
            System.out.println(key+" "+map.get(key));
        }
        System.out.println("-----通过比较器实现比较规则-------");
        //java.lang.ClassCastException: 双例集合.Student cannot be cast to java.lang.Comparable
        //创建StudentComparator对象,然后交给TreeMap的构造方法中
        Map<Student,String> treeMap = new TreeMap<>(new StudentComparator());
        Student s1 = new Student("liu",18);
        Student s2 = new Student("admin",20);
        Student s3 = new Student("sxt",20);
        treeMap.put(s1,"liu");
        treeMap.put(s2,"admin");
        treeMap.put(s3,"sxt");
        Set<Student> keys2 = treeMap.keySet();
        for (Student key:keys2){
            System.out.println(key+" "+treeMap.get(key));
        }

    }
}

blob.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 3195楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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