Thread t1先执行调用cmanufacture();打印"制造一台电脑" t1等待被t2唤醒wait();
Thread t2执行时调用ctransport();但是没有打印"运走一台电脑"因为"运走一台电脑"没有在ctransport();中wait()前打印,而是在ctransport();调用后打印的,所以这里没有输出
t2执行唤醒t1 notify();t2等待被t1唤醒wait();注意这时ctransport();并没有执行完,它还在等待被t1唤醒
Thread t1再执行调用cmanufacture();打印"制造一台电脑" 唤醒t2 notify();这时ctransport();执行完了打印"运走一台电脑"然后t1等待被唤醒wait();
Thread t2执行时调用ctransport();但是没有打印"运走一台电脑"唤醒t1 notify();t2 wait();注意这时ctransport();并没有执行完,它还在等待被t1唤醒
Thread t1执行调用cmanufacture();打印"制造一台电脑" 唤醒t2 notify();这时ctransport();执行完了打印"运走一台电脑"然后t1等待被唤醒wait();
上面是造成"制造一台电脑"在开头被打印两次的原因
解决办法就是把打印"运走一台电脑"放到ctransport();函数中wait();语句前,就不会出现打印两次的情况了
像这样:完整的程序如下:
package exercise2;class Computer {
private int mfg=1;
int stack=0;
public synchronized void manufacture(){
try {
Threadsleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1printStackTrace();
}
Systemoutprintln("制造一台电脑");
mfg=1;
notify();
if(mfg==1){
try{
wait();
}catch(InterruptedException e){
eprintStackTrace();
}
}
}
public synchronized void transport(){
try {
Threadsleep(50);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1printStackTrace();
}
Systemoutprintln("运走一台电脑");//这里加上打印语句
stack+=1;
mfg=0;
notify();
if(mfg==0){
try{
wait();
}catch(InterruptedException e){
eprintStackTrace();
}
}
}
}
class producer implements Runnable{
Computer c=null;
public producer(Computer c) {
thisc = c;
}
@Override
public void run() {
while(true){
cmanufacture();
}
}
}
class Consumer implements Runnable{
Computer c=null;
public Consumer(Computer c) {
thisc = c;
}
@Override
public void run() {
while(true){
ctransport();
//Systemoutprintln("运走一台电脑");//这里去掉打印语句 移动到ctransport();函数中wait语句前
}
}
}
public class Ex22_2 {
public static void main(String[] args) {
Computer c=new Computer();
Thread t1=new Thread(new producer(c));
Thread t2=new Thread(new Consumer(c));
t1start();
t2start();
try {
Threadsleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
t1stop();
t2stop();
Systemoutprintln(cstack);
}
}
运行结果:
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
运走一台电脑
制造一台电脑
14
界面自己写一下就可以了,把相关的参数传进去就可以了。 这个是我以前写的。用的javamail。 有main方法,测试一下自己的邮件,应该没问题的。希望可以帮到你。注意导入你需要的javamailjar的包 -------------------------------------------------------------- package comfourpanemail; import javautilProperties; import javaxmailAddress; import javaxmailFlags; import javaxmailFolder; import javaxmailMessage; import javaxmailMessagingException; import javaxmailNoSuchProviderException; import javaxmailSession; import javaxmailStore; import javaxmailTransport; import javaxmailinternetAddressException; import javaxmailinternetInternetAddress; import javaxmailinternetMimeMessage; public class TestMail { public static void main(String[] args) { //TestMailsendMail(); //TestMailreceiveMail(); TestMaildeleteMail(); } / send mail / public static void sendMail() { String host = "smtpsinacom";//邮件服务器 String from = "xingui5624@sinacom";//发件人地址 String to = "ilovenumen@vipsinacom";//接受地址(必须支持pop3协议) String userName = "xingui5624";//发件人邮件名称 String pwd = "";//发件人邮件密码 Properties props = new Properties(); propsput("mailsmtphost", host); propsput("mailsmtpauth", "true"); Session session = SessiongetDefaultInstance(props); sessionsetDebug(true); MimeMessage msg = new MimeMessage(session); try { msgsetFrom(new InternetAddress(from)); msgaddRecipient(MessageRecipientTypeTO, new InternetAddress(to));//发送 msgsetSubject("我的测试");//邮件主题 msgsetText("测试内容。。。。。。。");//邮件内容 msgsaveChanges(); Transport transport = sessiongetTransport("smtp"); transportconnect(host, userName, pwd);//邮件服务器验证 transportsendMessage(msg, msggetRecipients(MessageRecipientTypeTO)); Systemoutprintln("send ok"); } catch (AddressException e) { eprintStackTrace(); } catch (MessagingException e) { eprintStackTrace(); } } / receive mail / public static void receiveMail() { String host = "pop3sinacom"; String userName = "xingui5624"; String passWord = ""; Properties props = new Properties(); Session session = SessiongetDefaultInstance(props); sessionsetDebug(true); try { Systemoutprintln("receive"); Store store = sessiongetStore("pop3"); storeconnect(host, userName,passWord);//验证 Folder folder = storegetFolder("INBOX");//取得收件文件夹 folderopen(FolderREAD_WRITE); Message msg[] = foldergetMessages(); Systemoutprintln("邮件个数:" + msglength); for(int i=0; i<msglength; i++) { Message message = msg[i]; Address address[] = messagegetFrom(); StringBuffer from = new StringBuffer(); / 此for循环是我项目测试用的 / for(int j=0; j<addresslength; j++) { if (j > 0) fromappend(";"); fromappend(address[j]toString()); } Systemoutprintln(messagegetMessageNumber()); Systemoutprintln("来自:" + fromtoString()); Systemoutprintln("大小:" + messagegetSize()); Systemoutprintln("主题:" + messagegetSubject()); Systemoutprintln("时间::" + messagegetSentDate()); Systemoutprintln("==================================================="); } folderclose(true);//设置关闭 storeclose(); Systemoutprintln("receive over"); } catch (NoSuchProviderException e) { eprintStackTrace(); } catch (MessagingException e) { eprintStackTrace(); } } / delete mail / public static void deleteMail() { String host = "pop3sinacom"; String userName = "xingui5624"; String passWord = ""; Properties props = new Properties(); //Properties props = SystemgetProperties();这种方法创建 Porperties 同上 Session session = SessiongetDefaultInstance(props); sessionsetDebug(true); try { Systemoutprintln("begin delete "); Store store = sessiongetStore("pop3"); storeconnect(host, userName, passWord);//验证邮箱 Folder folder = storegetFolder("INBOX"); folderopen(FolderREAD_WRITE);//设置我读写方式打开 int countOfAll = foldergetMessageCount();//取得邮件个数 int unReadCount = foldergetUnreadMessageCount();//已读个数 int newOfCount = foldergetNewMessageCount();//未读个数 Systemoutprintln("总个数:" +countOfAll); Systemoutprintln("已读个数:" +unReadCount); Systemoutprintln("未读个数:" +newOfCount); for(int i=1; i<=countOfAll; i++) { Message message = foldergetMessage(i); messagesetFlag(FlagsFlagDELETED, true);//设置已删除状态为true if(messageisSet(FlagsFlagDELETED)) Systemoutprintln("已经删除第"+i+"邮件。。。。。。。。。"); } folderclose(true); storeclose(); Systemoutprintln("delete ok"); } catch (NoSuchProviderException e) { eprintStackTrace(); } catch (MessagingException e) { eprintStackTrace(); } } / reply mail / public static void replyMail() { //test } } 注意:此实现要求邮箱都支持pop3和smtp协议。现在老的网易邮箱都支持(2006年以前注册的),所以的sina的 qq的都可以,雅虎的部分支持,具体的可以在网上搜下把。 ============================================================================== 还有一种办法,也是我以前用到的。 其实最简单的发邮件方式是用Apache的Common组件中的Email组件,封装得很不错。 特简单。首先从Sun的网站上下载JavaMail框架实现,最新的版本是141。然后是JavaBeans Activation Framework,最新版本111,JavaMail需要这个框架。不过如果JDK是16的话就不用下了。16已经包括了JavaBeans Activation Framework。 最后从 >
11 基本配置
elasticsearch的config文件夹里面有两个配置文 件:elasticsearchyml和loggingyml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日 志的,所以loggingyml里的设置按普通log4j配置文件来设置就行了。下面主要讲解下elasticsearchyml这个文件中可配置的东西。
clustername: elasticsearch
配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
nodename: "Franz Kafka"
节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里nametxt文件中,其中有很多作者添加的有趣名字。
nodemaster: true
指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
nodedata: true
指定该节点是否存储索引数据,默认为true。
indexnumber_of_shards: 5
设置默认索引分片个数,默认为5片。
indexnumber_of_replicas: 1
设置默认索引副本个数,默认为1个副本。
pathconf: /path/to/conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。
pathdata: /path/to/data
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例:
pathdata: /path/to/data1,/path/to/data2
pathwork: /path/to/work
设置临时文件的存储路径,默认是es根目录下的work文件夹。
pathlogs: /path/to/logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹
pathplugins: /path/to/plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrapmlockall: true
设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和 ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。
networkbind_host: 19216801
设置绑定的ip地址,可以是ipv4或ipv6的,默认为0000。
networkpublish_host: 19216801
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
networkhost: 19216801
这个参数是用来同时设置bind_host和publish_host上面两个参数。
transporttcpport: 9300
设置节点间交互的tcp端口,默认是9300。
transporttcpcompress: true
设置是否压缩tcp传输时的数据,默认为false,不压缩。
>
public class Demo1 {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Properties props = new Properties();
propssetProperty("mailsmtpauth", "true");
propssetProperty("mailtransportprotocol", "smtp");
Session session = SessiongetInstance(props);
sessionsetDebug(true);
Message msg = new MimeMessage(session);
msgsetText("邮件测试");
msgsetFrom(new InternetAddress("你的邮箱号"));
Transport transport = sessiongetTransport();
transportconnect("邮箱驱动", 25, "邮箱账号", "邮箱密码");
transportsendMessage(msg,
new Address[]{new InternetAddress("对方的邮箱号")});
transportclose();
}
}
transport
transport
[træns`port, -`pɒrt; trænˋspɒ:t]
及物动词
1 把<东西>[从…]运输
[到…],运送[from][to]
~ goods by truck [ (
英)lorry] 用卡车运送货物
The products were ~ed from the factory to the station
产品从工厂被运到车站
2 把<犯人>流放[到…],放逐[to]
3 (文语)使<人>热衷,使…著迷; 使…心情极度激动[with]
He was ~ed with joy [grief] to hear those words
他听了那些话喜不自胜 [悲伤不已]
[`trAnsport, -pCrt; 5trAnspC:t]
名词
1 (U)
a (英)运输; 运输工具[系统]( (美)transportation)
the ~ of mail by air
邮件的航空运送
We were deprived of any (means of) ~ during the storm
在暴风雨期间我们一切交通都断绝了 [一切交通工具陷于瘫痪]
b (口语)交通工具的班次
2 (C)运输船, (军用) 运输舰; 运输 (飞) 机
3 [a ~; 又作 ~s] (文语)恍惚,忘我
He was in a ~ [in ~s] of joy
他高兴得不得了 [欣喜若狂]
以上就是关于帮忙介绍一本电子书,里面有比较详细的JavaMaiL的解说全部的内容,包括:帮忙介绍一本电子书,里面有比较详细的JavaMaiL的解说、transit和transport的区别、这个多线程java程序为什么会最开始执行同一个线程两次等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)