2017年4月17号 空气质量:重度雾霾加柳絮
内容:多线程练习demo,synchronized,arraylist如何用synchronized使线程安全举例,关于网络的一点儿基础知识,sendmail
一、多线程练习demo
老师代码:
package cn.bdqn.join05;
/**
* 模拟 10个特需号病人看病
*/
public class HosThread implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println("*******特需号" + i + "在看病");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// main主线程
public static void main(String[] args) {
// 实例化特需号的线程类
Thread thread = new Thread(new HosThread());
// 特需号比普通号的概率高
thread.setPriority(thread.MAX_PRIORITY);
thread.start();
// 主线程 普通号也并行看病
for (int i = 1; i <= 50; i++) {
System.out.println("普通号" + i + "在看病");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 如果普通号看到第10个人 特需号需要全部结束
if (i == 10) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
二、synchronized部分知识图示
三、synchronized 方法
老师代码:
1)线程不安全:
package cn.bdqn.sale07;
// 线程不安全
public class MyThread implements Runnable {
private int count = 100; // 库存的票数
private int num = 0; // 记录买的票数
@Override
public void run() {
while (true) {
if (count <= 0) {
break;
}
num++;
count--;
// 卖出一张票
System.out.println(Thread.currentThread().getName() + "抢到了" + (num)
+ "===>剩余票数是:" + (count));
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
Thread t1 = new Thread(thread, "小黑");
Thread t2 = new Thread(thread, "小白");
Thread t3 = new Thread(thread, "黄牛");
t1.start();
t2.start();
t3.start();
}
}
2)同步方法:
package cn.bdqn.sale07;
//同步方法
public class MyThread02 implements Runnable {
private int count = 100; // 库存的票数
private int num = 0; // 记录买的票数
private boolean flag = false; // run()什么时候不调用售票的方法
// 给方法加锁,如果一个线程进入,则其他所有的线程需要等待!
public synchronized void sale() {
if (count <= 0) {
flag = true;
return;
}
num++;
count--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 卖出一张票
System.out.println(Thread.currentThread().getName() + "抢到了" + (num)
+ "===>剩余票数是:" + (count));
}
@Override
public void run() {
while (!flag) {
sale();
}
}
public static void main(String[] args) {
MyThread02 thread = new MyThread02();
Thread t1 = new Thread(thread, "小黑");
Thread t2 = new Thread(thread, "小白");
Thread t3 = new Thread(thread, "黄牛");
t1.start();
t2.start();
t3.start();
}
}
四、synchronized 块
老师代码:
1)同步代码块:
package cn.bdqn.sale07;
//同步代码块
public class MyThread03 implements Runnable {
private int count = 100; // 库存的票数
private int num = 0; // 记录买的票数
@Override
public void run() {
while (true) {
synchronized (this) {//锁的其实是对象
if (count <= 0) {
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 卖出一张票
System.out.println(Thread.currentThread().getName() + "抢到了"
+ (++num) + "===>剩余票数是:" + (--count));
}
}
}
public static void main(String[] args) {
MyThread03 thread = new MyThread03();
Thread t1 = new Thread(thread, "小黑");
Thread t2 = new Thread(thread, "小白");
Thread t3 = new Thread(thread, "黄牛");
t1.start();
t2.start();
t3.start();
}
}
五、arraylist如何用synchronized使线程安全举例(同步代码块)
老师代码:
package cn.bdqn.test08;
import java.util.ArrayList;
public class ArrayListTest implements Runnable {
private ArrayList<String> list = new ArrayList<>();
private int index = 0;
@Override
public void run() {
while (true) {
synchronized (list) {
if (index > 100) {
break;
}
list.add(index + "");
System.out.println("下标为" + index + "的值是===》" + list.get(index));
index++;
}
}
}
public static void main(String[] args) {
// 实例化线程对象
ArrayListTest test = new ArrayListTest();
for (int i = 1; i <= 10; i++) {
new Thread(test).start();
}
}
}
六、关于网络的一点儿基础知识
1、IP地址:
端口号:独一无二
2、TCP/IP协议
本机预留IP:
1) IPV4:127.0.0.1
2) IPV6: : : 1
3、远程连接
1)windows+R------>mstsc:远程桌面连接(进入下图所示界面,输入想要连接电脑的IP地址,之后需要输入被连接电脑用户名和密码)
2)远程连接前需要条件:双方都关闭防火墙,以及右键点击我的电脑进行远程设置(如下图所示):
3)使用此方式远程连接后,被连接电脑黑屏,被连接电脑操作后,远程连接会断开。
4、DNS域名解析
七、sendmail
先导入javax.mail.jar包
老师代码:
package cn.bdqn.mail;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class SendMail {
public static void main(String[] args) {
// 定义收件人邮箱
String to = "123456789@qq.com";
// 定义发件人邮箱
final String from = "987654321@qq.com";
// 设置邮件的主机
String host = "smtp.qq.com";
// 设置系统属性
Properties properties = System.getProperties();
// 设置邮件服务器需要的参数
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.socketFactory.class",
" javax.net.ssl.SSLSocketFactory");
properties.setProperty("mail.smtp.port", "465");
properties.setProperty("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.auth", "true");
// 创建会话
Session session = Session.getDefaultInstance(properties,
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(from, "jpwy999_");
}
});
try {
// 开始写邮件内容
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(
to));
// 邮件标题
message.setSubject("月薪500K招聘 java初级程序猿");
BodyPart part = new MimeBodyPart();
part.setText("详情请咨询150********! 联系人:xxx");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(part);
message.setContent(multipart);
Transport.send(message);
System.out.println("成功了!");
} catch (Exception e) {
System.out.println("报错了 !");
}
}
}
八、作业
1、开始构思写U1的项目,准备写完答辩(不要逃避,慢慢写)
2、做题
九、考试
2017.04.17
15: 05开始,16:10结束;答题时间:59 分钟;检查时间: 1分钟;
成绩:88 分
网络卡顿加上出去找椅子耗费5分钟,因为隔壁讲课太吵所以听音乐(结果总是被音乐带走神以至于答题太慢)
多做题,刷复习题!巩固之前的知识点!
十、老师辛苦了!