滨州网站建设滨州网站的下拉列表怎么做

当前位置: 首页 > news >正文

滨州网站建设滨州,网站的下拉列表怎么做,如何给自己的公司做网站,wordpress后台翻译一、线程简介 线程是操作系统能够进行运算调度的最小单位#xff0c;它被包含在进程之中#xff0c;是进程中的实际运作单位。一个进程可以包含多个线程#xff0c;这些线程可以并发执行。线程拥有自己的栈和局部变量#xff0c;但是它们共享进程的其他资源#xff0c;如…一、线程简介 线程是操作系统能够进行运算调度的最小单位它被包含在进程之中是进程中的实际运作单位。一个进程可以包含多个线程这些线程可以并发执行。线程拥有自己的栈和局部变量但是它们共享进程的其他资源如全局变量、堆内存等。线程的优先级决定了线程需要时间片多少分配的线程属性。线程的启动和终止需要通过构造线程对象和调用start()方法来实现。 二、创建线程 1、继承Thread类 Thread类是java.lang包中的一个类从这个类中实例化的对象代表线程程序员启动一个新线程需要建立Thread实例。Thread类中常用的两个构造方法如下 1.public Thread()创建一个新的线程对象。 2.public Thread(String threadName):创建一个名称为threadName的线程对象。 继承Thread类创建一个新的线程的语法如下 public class ThreadTest extends Thread{ } 完成线程真正的功能的代码放在类的run()方法中当一个类继承Thread类后就可以在该类中覆盖run()方法将实现该线程功能的代码写入run()方法中然后调用Thread类中的start()方法执行线程也就是调用run方法。 Thread对象需要一个人物来执行任务是指线程在启动时执行的工作该工作的功能代码被写在run方法中。run()方法必须使用以下语法格式 public void run(){ } 注意start()方法调用一个已经启动的线程系统将抛出IllegalThreadStateException异常。 当执行一个线程程序时就自动产生一个线程主方法正是在这个线程上运行的。当不再启动其他线程时该程序就为单线程程序如本章以前的程序都是单线程程序。主方法线程启动由Java虚拟机负责程序员负责启动自己的线程。代码如下 public static void main(String[] args){new ThreadTest().start(); } 例题让线程循环打印1~10的数字 start()方法会启动线程线程自动执行run()方法中的代码就可以看到for循环打印的数字了。 在main()方法中使线程执行需要调用Thread类中的start()方法start()方法调用被覆盖的run()方法如果不调用start()方法线程永远都不会启动在主方法没有调用start()方法之前Thread对象只是一个实例而不是一个真正的线程。 2、实现Runnable接口 例题让窗口中的图标动起来 三、线程的生命周期 线程具有生命周期其中包含 7 种状态分别为出生状态、就绪状态、运行状态、等待状态、眠状态、阻塞状态和死亡状态。出生状态就是线程被创建时处于的状态在用户使用该线程实例调用start0方法之前线程都处于出生状态;当用户调用 start()方法后线程处于就绪状态 (又被称为可执状态);当线程得到系统资源后就进入运行状态。 一旦线程进入可执行状态它会在就绪与运行状态下转换同时也有可能进入等待、休眠、阻塞或死亡状态。当处于运行状态下的线程调用 Thread 类中的wait0方法时该线程便进入等待状态进入等待状态的线程必须调用Thread类中的notify()方法才能被唤醒而调用notifvAll()方法可将所有处于等待状态下的线程唤醒;当线程调用 Thread 类中的sleep()方法时则会进入休眠状态。如果一个线程在运行状态下发出输入/输出请求该线程将进入阻塞状态在其等待输入/输出结束时线程进入就绪状态对于阻塞的线程来说即使系统资源空闲线程依然不能回到运行状态。当线程的run()方法执行完毕时线程进入死亡状态。 四、操作线程的方法 1、线程的休眠 一种能控制线程行为的方法是调用sleep()方法sleep()方法需要一个参数用于指定该线程休眠的时间该时间以毫秒为单位。在前面的实例中已经演示过sleep()方法它通常是在run()方法内的循环中被使用。sleep()方法的语法如下 try{Thread.sleep(2000); }catch(InterruptedException e){e.printStackTrace(); } 上述代码会使线程在2秒之内不会进入就绪状态。由于sleep()方法的执行有可能抛出InterruptedException异常所以将sleep()方法的调用放在try-catch块中。虽然使用了sleep()方法的线程在一段时间内会醒来但是并不能保证它醒来后进入运行状态只能保证它进入就绪状态。 例题每0.1秒绘制一条随机颜色的线条 在本实例中定义了 getC()方法该方法用于随机产生 Color 类型的对象并且在产生线程的匿名内部类中使用 getGraphics()方法获取 Graphics 对象使用该对象调用setColor0方法为图形设置颜色。调用 drawLine()方法绘制一条线段同时线段会根据纵坐标的变化自动调整。 2、线程的加入 如果当前某程序为多线程程序假如存在一个线程 A现在需要插入线程 B并要求线程B先执行完毕然后再继续执行线程A此时可以使用 Thread 类中的 join()方法来完成。这就好比此时读者正在看电视突然有人上门收水费读者必须付完水费后才能继续看电视。         当某个线程使用 join()方法加入另外一个线程时另一个线程会等待该线程执行完毕后再继续执行。下面来看一个使用 join()方法的实例。 例题让进度条A等待进度条B 3、线程的中断 以往有的时候会使用stop()方法停止线程但当前版本的JDK早已废除了stop()方法不建议使用stop()方法来停止一个线程的运行。现在提倡在run()方法中使用无限循环的形式然后使用一个布尔型标记控制循环的停止。 如果线程是因为使用了sleep()或wait()方法进入了就绪状态可以使用Thread类中interrupt()方法使线程离开run()方法同时结束线程但程序会抛出InterruptedException异常用户可以在处理该异常时完成线程的中断业务处理如终止while循环。 例题单击按钮停止进度条滚动 4、线程的礼让 Thread类中提供了一种礼让方法使用yield()方法表示它只是给当前正处于运行状态的线程一个提醒告知它可以将资源礼让给其他线程但这仅是一种暗示没有任何一种机制保证当前线程会将资源礼让。 yield()方法使具有同样优先级的线程有进入可执行状态的机会在当前线程放弃执行权时会再度回到就绪状态。对于支持多任务的操作系统来说不需要调用yield()方法因为操作系统会为线程自动分配CPU时间片来执行。 五、线程的优先级 例题观察不同优先级的线程执行完毕顺序 由于线程的执行顺序是由CPU决定的即使线程设定了优先级也是作为CPU的参考数据所以真实的运行结果可能并不一定按照优先级排序例如笔者运行的结果如上。执行顺序为DCBA 六、线程同步 1、线程安全 实际开发中使用多线程程序的情况很多如银行排号系统、火车站售票系统等。这种多线程的程序通常会发生问题以火车站售票系统为例在代码中判断当前票数是否大于0如果大于0则执行将该票出售给乘客的功能但当两个线程同时访问这段代码时(假如这时只剩下一张票)第一个线程将票售出与此同时第二个线程也已经执行完成判断是否有票的操作并得出票数大于0的结论于是它也执行售出操作这样就会产生负数。所以在编写多线程程序时应该考虑到线程安全问题实质上线程安全问题来源于两个线程同时存取单一对象的数据。 例如在项目中创建ThreadSafeTest类该类实现了Runnable接口在未考虑到线程安全问题的基础上模拟火车站售票系统的功能的代码如下: 2、线程同步机制 例题开发线程安全的火车售票系统 同步方法就是在方法前面用synchronized关键字修饰的方法其语法如下: synchronized void f(){} 当某个对象调用了同步方法时该对象上的其他同步方法必须等待该同步方法执行完毕后才能被执行。必须将每个能访问共享资源的方法修饰为synchronized否则就会出错。 修改例20.7的代码将共享资源操作放置在一个同步方法中代码如下: nt num 10: public synchronized void doit() {//定义同步方法if(num0){try{Thread.sleep(10);}catch(InterruptedException e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()————票数num–);} } public void run(){while(true){doit();} //在run()方法中调用该同步方法 }