javaj第三周学习总结

多线程:
所谓多线程就是在同一时间进行多项任务,为了不因为等待造成程序暂停就可以用另外的线程进行其他工作。
Java常用包中提供了一个Thread类创建一个类并继承它,重写其中的run()方法,在run()方法体中写入自己想实现多线程的任务然后在主程序中使用start()方法启动线程。
比如:
现在创建一个类继承Thread类在其中写一个run()方法

int time = ((int)(Math.random()*100000))%10+5;//生成一个5~15的随机数
try {
			Thread.sleep(time*1000);/以毫秒为单位的睡眠
			System.out.println(i+"已完成");睡眠结束后输出
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

这段程序表示让程序睡眠5~15秒继续执行,多线程就是多个任务在互不干扰的情况下执行,现在要同时进行的代码已经完成,再就是要写一个运行此代码的主程序

public static void main(String[] args) {
		List<BoilNoodles> bns = new ArrayList<BoilNoodles>();
		for (int i = 1; i <= 10; i++) {
//实例化刚刚继承了Thread类的类
			BoilNoodles tmpBoilNoodles = new BoilNoodles();
			//刚刚的类中封装了一个i,现在使用循环传值给i
			tmpBoilNoodles.setI(i);
//将i中的值一个一个存入集合
			bns.add(tmpBoilNoodles);
		}
		for (int i = 0; i < bns.size(); i++) {
			//使用循环按序号启动多线程run()方法
bns.get(i).start();
		}	
	}

上述程序会将几乎同时进入run()执行睡眠,因为是多线程所以结果会是十次的睡眠同时进行,根据各自随机的睡眠时间不同而先后输出 “i已完成”。
多线程有时候也会有麻烦,若run()方法中同时进行的程序有if条件判断,有可能会不起作用,多线程同时执行时可能if中的条件是共同执行的,我们设置的条件想执行的else中的代码就没用了,这时候Java提供了一个synchronized对象,将if条件放入该对象中
Synchronized(object对象){
多线程方法体

这个对象的作用是限制只让程序一次一次的执行,只有上一个任务执行完了之后才能继续执行下一次,若把此对象放入我们上面的代码中又会与我们写多线程的初心冲突。
既然只能一次一次执行那这和普通循环也没什么区别,所以要将上述代码做点小改动。

	try {
		Thread.sleep(time*1000);/以毫秒为单位的睡眠
		synchronized(object){
		if(count>5){
			System.out.println(i+"已完成");睡眠结束后输出}
else{ System.out.println("我不干了"); }
}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

将睡眠提到synchronized外让程序的睡眠不冲突又能一次一次的判断执行想执行的程序。
同步的前提
–多个线程
–多个线程使用的是同一个锁对象
同步的好处
–同步的出现解决了多线程的安全问题。
同步的弊端
–当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
网络编程:
两台电脑之间发送信息接受消息,类似聊天室,java给我们提供了一个net包,包中有三个常用类
–InetAddress :主要提供对IP地址的获取和操作
–Socket:发送和接受数据
–ServerSocket :接受端绑定端口

首先是发送端的代码:

int port = 8888;//设置端口号
		
try {//localhost是本机IP只有一台电脑只能对自己发送	
			InetAddress client = InetAddress.getByName("localhost");
			Socket skt = new Socket(client, port);
			New一个socket并绑定IP和端口号
			System.out.print("请输入:");
			String str = input.next();
			
			OutputStream os = skt.getOutputStream();
//因为上面skt绑定了IP和端口号所以我们这里使用一个类实例化一个可以发送数据的对象os
			byte[] buf = str.getBytes();
			os.write(buf);
			//发送数据
			System.out.println("发送完毕!");
			//关闭数据流
			os.close();
			skt.close();
			
		} catch (Exception e) {
			// TODO: handle exception
		}

接收端的代码:

int port = 8888;	//端口号
		try {
			//1.创建服务端
			ServerSocket ss = new ServerSocket(port);	
			//2.开启监听
			System.out.println("开启监听...");
//使用accept方法将上面代码发送的数据传到Socket
			Socket skt = ss.accept();
			//3.将接收到的数据进行显示
			InputStream is = skt.getInputStream();
			byte[] buf = new byte[1024];
			int len = is.read(buf);
			String str = new String(buf, 0, len);
			
			System.out.println("接收到的数据:"+str);
			
			//4.关闭服务器
			is.close();
			skt.close();
			ss.close();
			
		} catch (Exception e) {
			// TODO: handle exception
		}

JDBC编程:
就是将数据存入数据库的增删改查操作,在java中操作数据库会用到几个主要的而关键类。
Connection:连接数据库,需要IP和数据库的连接名和连接密码
PreparedStatement:配合Connection使用一般用来传入sql语句
ResultSet :类似游标的作用,其中有一个next方法用来查看执行结果,或直接将其当作一个集合返回返回。
代码:

//首先定义三个全局变量
static Connection con = null;//连接数据库的类
static PreparedStatement ps = null;//执行sql语句的类
static ResultSet rs=null;//游标 
static String driver = "com.mysql.jdbc.Driver";//路径类名
static String url ="jdbc:mysql://127.0.0.1:3306/myktv?characterEncodings=UTF-8";//IP端口和数据库名

连接数据库的方法

private static Connection getConnerct(){
		try {
			Class.forName(driver);//加载驱动,这个类的包由我们自己导入
			//连接的数据库的账号密码
			con = DriverManager.getConnection(url, "root", "root");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return con;
	}
//执行sql代码后返回一个集合
	public static ResultSet getResultSet(String sql) {
		con  = getConnerct();
		try {
			//执行传入的sql语句
			ps = con.prepareStatement(sql);
			//ͨ使用游标查看sql语句
			rs = ps.executeQuery();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return rs;
	}

这里需要了解的一个方法executeQuery(),这个方法还有一个类似的常用方法,这里我们用到的是返回一个集合。还有一个executeUpdate()方法是执行代码后返回受影响的行,一般添加、删除、修改就是使用本方法返回一个值。
上述代码只是传入sql的与数据库距离最近的层,现在开始就是写sql语句的代码,会用到上述方法完成一个操作。

public List<Singer> selectAll() {
		List<Singer> list  = new ArrayList<Singer>();//集合
		String strsql = "SELECT SingerID,SingerName,SingerType,Birthday,Area,PhotoPath FROM singertbl";//sql代码
		list = getSingerList(strsql);//调用下方方法传入sql语句
		return list;
	}
	public List<Singer> getSingerList(String strsql){
			List<Singer> list = new ArrayList<Singer>();
			ResultSet rs = null;执行sql代码会返回一个集合
				rs = DbManager.getResultSet(strsql);//将sql代码传入刚刚写的方法内连接数据库并执行
			try {
				while(rs.next()){
					Singer singer= new Singer();
					//Singer类中的变量都是封装的,将集合内的值按字段一个一个拿出来,使用setXXX()方法赋值
					singer.setSingerID(rs.getInt("SingerID"));
					singer.setSingerName(rs.getString("SingerName"));
					singer.setSingerType(rs.getString("SingerType"));
					singer.setBirthday(rs.getString("Birthday"));
					singer.setArea(rs.getString("Area"));
					singer.setPhotoPath(rs.getString("PhotoPath"));
					list.add(singer);//将整个实例化的变量singer添加到集合list返回到service层再返回界面层
				}
				
			} catch (Exception e) {
				// TODO: handle exception
			}
			
		return list;
	}

完成查找的功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值