多线程:
所谓多线程就是在同一时间进行多项任务,为了不因为等待造成程序暂停就可以用另外的线程进行其他工作。
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;
}
完成查找的功能