课堂笔记-第5节

时间:2021-11-13 06:45:49

呵呵,到此为止,小编我已听了5节课了,陆续下面还有会继续更新课堂笔记-第5节

1.El表达式
(Expression Language)不区分单引号和双引号,
 <%=23/5 %>,${23/5 }    结果不一样 4,4.6
El表达式有几个隐式对象?
1.与范围有关的隐式对象。
pageScope,requestScope,sessionScope,ApplicationScope
2.输入有关隐式对象
param,paramValues
3.其他隐式对象
cookie,header,headerValues,initParam,pageContext,


El运算符
1.算数运算符有五个:+、-、*或$、/或div、%、或mod
2.关系运算符有六个:==或eq、!= 或ne、<或lt、>或gt、<=或le、>=或ge
3.逻辑运算符有三个:&&或and、||或Or、!或not
4、其他运算符有三个:Empty运算符、条件运算符、()运算符
例如:$(empnty param.name)、${A?B:C}、${A*(B+C)}


进程和线程?
程序:程序是一段静态的代码,他是应用程序执行的蓝本
进程:进程是指一种正在运行的程序,有自己的地址空间
进程的特点:
动态性 
并发性 
独立性 


多线程的优势?
多线程使系统空转时间减少,提高CPU利用率进程间不能共享内存,但线程之间共享内存非常容易
使用多线程实现多任务并发比多进程的效率高,Java语言内置多线程功能支持,简化了Java的多线程编程


两种实现多线程的方式?
继承Java.lang.Thread类,并覆盖run() 方法
class MyThread>线程的状态?

新生:使用new关键字创建一个线程后,尚未调用其start方法之前 


可远行: 调用线程对象的start方法之后这个状态当中,线程对象可能正在运行,也可能等待运行
阻塞:一种“不可运行”的状态,在得到一个特定的事件之后会返回到可运行状态
死亡:线程的run方法运行完毕或者在运行中出现未捕获的异常时 
优先级影响CPU在线程间切换,切换的原则是:
当一个线程通过显式放弃、睡眠或者阻塞、自愿释放控制权时,所有线程均接受检查而优先级高线程将会优先执行
一个线程可以被一个高优先级的线程抢占资源
同级别的线程之间,则通过控制权的释放,确保所有的线程均有机会运行。 
 


模拟4个售票点,卖50张票


package Thead;


public class Threads implements Runnable {
private>private>@Override
public void run() {
// TODO Auto-generated method stub
while(flag){
sale();
}

}
//同步方法监视器(this)
private synchronized void sale() {
// TODO Auto-generated method stub
if(tickes>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread()+ "正在卖第"+tickes--+"票");
}else{
System.out.println("已售完");
flag = false;
}
}


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Threads>Thread>Thread>Thread>Thread>t1.start();
t2.start();
t3.start();
t4.start();

}


}
同步块


public class Threads implements Runnable {
private>private>

@Override
public void run() {
// TODO Auto-generated method stub
while (flag) {
// sale();
synchronized (this) {
if (tickes > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "正在卖第"
+ tickes-- + "票");
} else {
System.out.println("已售完");
flag = false;
}
}


}
}








public static void main(String[] args) {
// TODO Auto-generated method stub
Threads>Thread>Thread>Thread>Thread>t1.start();
t2.start();
t3.start();
t4.start();


}


}




作业:设计四个线程,其中两个加线程,两个减线程,要求实现输出0 1 0 1  0 1
答:在下面方法里的Inc和Doc改成下面方法,即可实现

private>private synchronized void inc() {
// TODO Auto-generated method stub
if(j==0){
j=1;
}
if(j>=1){
j=0;
}
j++;
System.out.println(Thread.currentThread().getName()+"inc"+j);
}

}


private synchronized void doc() {
// TODO Auto-generated method stub
if(j>1||j<=0){
j=1;
}
j--;
System.out.println(Thread.currentThread().getName()+"doc"+j);
}

}
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 
package Thead;


public class TestThreads {
private>//加线程
private class Inc implements Runnable{//定义一个内部类,实现runnable的Run方法


@Override
public void run() {
// TODO Auto-generated method stub
for (int>inc();
}
}

private synchronized void inc() {//增加方法synchronized 
// TODO Auto-generated method stub
j++;
System.out.println(Thread.currentThread().getName()+"-inc"+j);
}

}
   //减线程
private class Doc implements Runnable{//定义一个内部类,实现runnable的Run方法




@Override
public void run() {
// TODO Auto-generated method stub
for (int>doc();
}
}


private synchronized void doc() {//减法synchronized 
// TODO Auto-generated method stub
j--;
System.out.println(Thread.currentThread().getName()+"-doc"+j);
}

}
//测试程序
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThreads>Thread>//创建两个线程类
Inc>Doc>//启动4个线程
for (int>th = new Thread(inc);
th.start();
th = new Thread(doc);
th.start();
}

}

}