黑马程序员0904_多线程部分+API部分

来源:互联网 发布:淘宝夜抢购报名入口 编辑:程序博客网 时间:2024/04/30 05:53

---------------------- android培训、java培训、期待与您交流! ----------------------

<--死锁-->
*实例代码:
class ThreadDemo1
{
 public static void main(String[] args)
 {
  TestThread tt = new TestThread();
  new Thread(tt).start();//加了这句后,主线程main暂时被挂起,程序开始执行前面那句定的义被挂起的的线程
  try{Thread.sleep(1);}catch(Exception e){}
  tt.str="method";
  new Thread(tt).start();
 }
}
class TestThread implements Runnable
{
 int ticket=10;
 String str = new String();
 public void run()
 {  //int ticket=10;如果一不小心将初始值放在这儿,还是会卖出4套1-10的票
  if (str.equals("method"))
  {
  synchronized(str)//加了这个语句块后,就保证线程的安全性,注意str的定义必须在run方法外,不然同步块失效
  {
  while(ticket>0)
  {
   try{Thread.sleep(10);}catch(Exception e){}//如果只sleep(1)的话,还是会正常运行
   synchronized (this){};
   System.out.println(Thread.currentThread().getName()+':'+ticket--);
  }
  }
  }
  else
  {
   while(ticket>0)
   {
    sale();
   }
  } 
 }
 public synchronized void sale()
 {  
   try{Thread.sleep(10);}catch(Exception e){}//如果只sleep(1)的话,还是会正常运行
   synchronized (str){};
   System.out.println(Thread.currentThread().getName()+"-sale:"+ticket--);
 }
}
整个程序会进入死锁状态
*用wait和notify可以解决线程间的通信问题,即加入有两个线程需要交替运行,不特别处理,会出现一个线程执行好几遍的状况。
*在运行wait和notify是使用的是锁旗标的方法,不然既synchronized所引用的对象,不然会报错。*notifyAll唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行,用于类似某个不定期的培训班终于招生满额后,通知所有的学员都来上课的情况。
【【【javaAPI】】】//看到这部分,都所谓的API豁然开朗,以前还误以为API好神秘,好高级。总有个别“高人”问我,你懂API吗?现在连我带他一起鄙视。。。
*API(application programming interface)
*Windows API 就是Windows操作系统提供的各种函数,例如,CreateWindow
*javaAPI,就是JDK中提供的各种java类,例如,System类

*JCreator的使用
*String类和StringBuffer类位于java.lang包中。//在后面还提到了StringBuilder类
*String类对象中的内容一旦被初始化就不能再改变。
*StringBuffer类用于封装内容可以改变的字符串,用toString方法转换成String类型;
*String x="a"+4+"c";编译时等效于:
String x=new StringBuffer().append("a").append(4).append("c").toString();
*字符串常量(如"hello")实际上是一种特殊的匿名String对象;
*实例(从键盘上读取数据,当读取到“bye”时,则程序结束)
class testapi
{
 public static void main(String [] args)
 {
  String s1=null;
  byte[] buffer = new byte[1024];
  int pos=0;
  int ch=0;
  while(true)
  {
  try{ch=System.in.read();}catch(Exception e){e.printStackTrace();}
  switch(ch)
  {
   case '\r': break;
   case '\n':
   s1=new String(buffer,0,pos); 
   if(s1.equals("bye"))
    return;
   else
    System.out.println(s1);pos=0;break;
   default:
    buffer[pos++]=(byte)ch;
  }
  }
 }
}
*equalsIgnoreCase方法可以实现对大小写不敏感的匹配;
*indexOf(int s,int ch)方法可以返回s在字符串第ch个开始找匹配到后字符串中的位置;
*subString(int beginindex,int endindex)返回从begin到end-1的字串
【基本数据类型的数据包装类】
*char->Character,int->Integer,其他的都把首字母大写即可;
*实例(main函数加了两个参数,然后画出一个*组成的矩形,自己加了try捕捉因为用户没正常输入两个参数从而数组越界而产生的异常)//后面的循环替代语句更没效率
class int1
{
 public static void main(String [] args)
 {
  int w=0;
  int h=0;
  try{
          w=new Integer(args[0]).intValue();
   h=Integer.parseInt(args[1]);
  }
  catch(Exception e)
  {
   System.out.println("me must have two parameter!");
   return ;
  }
  for(int i=0;i<h;i++)
  {
   StringBuffer s1=new StringBuffer();//String s1=new String();//
   for(int j=0;j<w;j++)
    s1.append('*');// s1=s1+"*";
   System.out.println(s1.toString());//System.out.println(s1);
  }
 }
}
【集合类】
*vector,enumeration,arraylist,collection,iterator,set,list(首字母都大写)等集合类和接口


---------------------- android培训、java培训、期待与您交流! ----------------------