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

网站怎么上传源码网页怎么保存到桌面

网站怎么上传源码,网页怎么保存到桌面,向国旗致敬做时代新人网站,客户关系管理的内容多线程 多线程1. 关于多线程的理解1.1 进程和线程1.2 并行和并发1.3 线程调度 2. 创建多线程的方式创建线程有哪几种方式#xff1f;2.1 通过继承Thread类来创建并启动线程的步骤如下#xff1a;2.2 通过实现Runnable接口来创建并启动线程的步骤如下#xff1a;2.3 通过实现… 多线程 多线程1. 关于多线程的理解1.1 进程和线程1.2 并行和并发1.3 线程调度 2. 创建多线程的方式创建线程有哪几种方式2.1 通过继承Thread类来创建并启动线程的步骤如下2.2 通过实现Runnable接口来创建并启动线程的步骤如下2.3 通过实现Callable接口来创建并启动线程的步骤如下 3 run()和start()有什么区别4 线程是否可以重复启动会有什么后果5. 说一说sleep()和wait()的区别6. 说一说notify()、notifyAll()的区别7. 如何实现子线程先执行主线程再执行8. Thread 类的方法8.1 构造方法8.2 Thread 类的常用方法 多线程 1. 关于多线程的理解 1.1 进程和线程 每个进程有多个线程 进程是系统运行程序的基本单元每个进程的内部数据和状态是完全独立的每一个应用程序运行的时候会产生一个进程线程就是一个进程中的执行单元。一个进程可以启动多个线程。cpu 调度和分配的最小单元。线程必须在某个进程内执行。 所以多线程就是在一个进程中同时运行了多个线程用来完成不同的工作则称之为多线程。 进程与线程的区别 进程有独立的内存空间进程中的数据存放空间堆空间和栈空间是独立的至少 有一个线程。线程堆空间是共享的栈空间是独立的线程消耗的资源比进程小的多。 1.2 并行和并发 并发Concurrency 并发是指多个任务在相同的时间段内交替执行每个任务可能只执行一小部分然后切换到另一个任务。并发并不一定意味着多个任务同时在不同的处理器核心上执行。它可以在单个处理器上通过时间片轮转来实现也可以在多个处理器核心上并行执行。通常多线程程序是并发的因为它们可以在单个处理器上通过线程切换实现并发执行。 示例多个线程在单个处理器上轮流执行共享CPU时间。 并行Parallelism 并行是指多个任务在相同的时间点上同时执行每个任务都在不同的处理器核心上运行。并行通常需要多核处理器或多个计算资源并且可以实现更高的性能因为多个任务可以在不互相干扰的情况下并行执行。并行通常用于解决需要高性能的问题如大规模数据处理或计算密集型任务。 示例多个线程在不同的处理器核心上同时执行各自独立工作。 总结 并发是任务在时间上交替执行可能在同一处理器核心上通过线程切换实现。并行是任务在同一时刻同时执行通常需要多个处理器核心或多个计算资源来实现。并发可以提高系统的响应性和资源利用率但并不一定提高吞吐量。并行通常用于提高性能特别是在多核处理器上可以实现更高的吞吐量 1.3 线程调度 每个程序至少自动拥有一个线程称为主线程 分时调度 所有线程轮流使用 CPU 的使用权平均分配每个线程占用 CPU 的时间。 抢占式调度 优先让优先级高的线程使用 CPU如果线程的优先级相同那么会随机选择一个(线程随机性) Java 使用的为抢占式调度。 2. 创建多线程的方式 创建线程有哪几种方式 创建线程有三种方式分别是继承Thread类、实现Runnable接口、实现Callable接口。 2.1 通过继承Thread类来创建并启动线程的步骤如下 定义Thread类的子类并重写该类的run()方法该run()方法将作为线程执行体。 创建Thread子类的实例即创建了线程对象。 调用线程对象的start()方法来启动该线程。 /*** 实现多线程的第一种方式* 第一种方式编写一个类直接继承java.lang.Thread重写run方法*/ public class ThreadDemo01 {public static void main(String[] args) {System.out.println(main start!);MyThread myThread new MyThread();myThread.test(); // 不会启动线程// 只有调用startmyThread.start();for (int i 0; i 10; i) {System.out.println(main线程);}} } // 自定义线程类 class MyThread extends Thread{Overridepublic void run(){Thread thread Thread.currentThread(); // 获取当前线程thread.setName(自定义线程); // 设置当前线程的名字String name thread.getName(); // 获取当前线程的名字for (int i 0; i 10; i) {System.out.println(name i);}}public void test(){System.out.println(test);} }2.2 通过实现Runnable接口来创建并启动线程的步骤如下 定义Runnable接口的实现类并实现该接口的run()方法该run()方法将作为线程执行体。创建Runnable实现类的实例并将其作为Thread的target来创建Thread对象Thread对象为线程对象。调用线程对象的start()方法来启动该线程。 /*** 实现多线程的第二种方式* 第二种方式编写一个类实现java.lang.Runnable接口*/ public class ThreadDemo02 {public static void main(String[] args) {// 创建任务对象MyRunnable myRunnable new MyRunnable();// 创建线程Thread tr new Thread(myRunnable,线程1);// 启动线程tr.start();System.out.println(主线程);// 除了上面使用的自定义类实现Runnable接口之外还可以使用匿名内部类、lambda表达式来实现Runnable接口Runnable runnable1 new Runnable() {Overridepublic void run() {System.out.println(使用匿名内部类实现Runnable接口。。);}};new Thread(runnable1).start();Runnable runnable2 ()-{String name Thread.currentThread().getName();System.out.println(name :使用匿名内部类实现Runnable接口。。);};new Thread(runnable2).start();} } // 自定义类实现 Runnable 接口 class MyRunnable implements Runnable{Overridepublic void run() {String name Thread.currentThread().getName();System.out.println(name 实现线程的第二种方式.);} }2.3 通过实现Callable接口来创建并启动线程的步骤如下 创建Callable接口的实现类并实现call()方法该call()方法将作为线程执行体且该call()方法有返回值。然后再创建Callable实现类的实例。使用FutureTask类来包装Callable对象该FutureTask对象封装了该Callable对象的call()方法的返回值。使用FutureTask对象作为Thread对象的target创建并启动新线程。调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。 /*** 创建线程的第三种方式* 实现Callable接口*/ public class ThreadDemo03 {public static void main(String[] args) throws ExecutionException, InterruptedException {// 使用匿名内部类实现Callable接口CallableInteger callable new Callable() {Overridepublic Integer call() throws Exception {int sum 0;for (int i 1; i 10; i) {sum i;}// 返回一个结果return sum;}};// 创建一个FutureTask 对象来接受异步计算的结果FutureTaskInteger futureTask new FutureTask(callable);// 创建线程Thread thread new Thread(futureTask);thread.start();// futureTask.get() 是在等待执行完毕获取结果所以是在线程启动之后才获取。System.out.println(futureTask.get());} }采用继承Thread类的方式、实现Runnable、Callable接口的方式创建多线程的优缺点 线程类只是实现了Runnable接口或Callable接口还可以继承其他类。而如果是已经继承Thread 类则不能再继承其它父类了。所以实现接口可以避免 java 中的单继承的局限性在实现Runnable、Callable接口的这种方式下多个线程可以共享同一个target对象所以非常适合多个相同的程序代码的线程去共享同一个资源的情况实现解耦操作较好地体现了面向对象的思想。线程池只能放入实现 Runnable 或 Callable 类线程不能直接放入继承 Thread 的类劣势是编程稍稍复杂如果需要访问当前线程则必须使用Thread.currentThread()方法。采用继承Thread类的方式创建多线程的优势是编写简单如果需要访问当前线程则无须使用Thread.currentThread()方法直接使用this即可获得当前线程。 鉴于上面分析因此一般推荐采用实现Runnable接口、Callable接口的方式来创建多线程。 3 run()和start()有什么区别 run()方法被称为线程执行体它的方法体代表了线程需要完成的任务而start()方法用来启动线程。调用start()方法启动线程时系统会把该run()方法当成线程执行体来处理。但如果直接调用线程对象的run()方法则run()方法立即就会被执行而且在run()方法返回之前其他线程无法并发执行。也就是说如果直接调用线程对象的run()方法系统把线程对象当成一个普通对象而run()方法也是一个普通方法而不是线程执行体。 4 线程是否可以重复启动会有什么后果 只能对处于新建状态的线程调用start()方法否则将引发IllegalThreadStateException异常。 扩展阅读 当程序使用new关键字创建了一个线程之后该线程就处于新建状态此时它和其他的Java对象一样仅仅由Java虚拟机为其分配内存并初始化其成员变量的值。此时的线程对象没有表现出任何线程的动态特征程序也不会执行线程的线程执行体。 当线程对象调用了start()方法之后该线程处于就绪状态Java虚拟机会为其创建方法调用栈和程序计数器处于这个状态中的线程并没有开始运行只是表示该线程可以运行了。至于该线程何时开始运行取决于JVM里线程调度器的调度。 5. 说一说sleep()和wait()的区别 sleep()是Thread类中的静态方法而wait()是Object类中的成员方法sleep()可以在任何地方使用而wait()只能在同步方法或同步代码块中使用sleep()不会释放锁而wait()会释放锁并需要通过notify() / notifyAll()重新获取锁。 6. 说一说notify()、notifyAll()的区别 notify() 用于唤醒一个正在等待相应对象锁的线程使其进入就绪队列以便在当前线程释放锁后竞争锁进而得到CPU的执行。 notifyAll() 用于唤醒所有正在等待相应对象锁的线程使它们进入就绪队列以便在当前线程释放锁后竞争锁进而得到CPU的执行。 7. 如何实现子线程先执行主线程再执行 启动子线程后立即调用该线程的join()方法则主线程必须等待子线程执行完成后再执行。 扩展阅读 Thread类提供了让一个线程等待另一个线程完成的方法——join()方法。当在某个程序执行流中调用其他线程的join()方法时调用线程将被阻塞直到被join()方法加入的join线程执行完为止。 join()方法通常由使用线程的程序调用以将大问题划分成许多小问题每个小问题分配一个线程。当所有的小问题都得到处理后再调用主线程来进一步操作。 8. Thread 类的方法 8.1 构造方法 Thread中常用的构造方法有 public Thread() :分配一个新的线程对象。public Thread(String name) :分配一个指定名字的新的线程对象。public Thread(Runnable target) :分配一个带有指定目标新的线程对象。public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。 8.2 Thread 类的常用方法 public static Thread currentThread() :返回对当前正在执行的线程对象的引用。 Thread.currentThread(); // 执行这句代码的线程public void run(): 表示线程的任务。 所有Thread的子类应该覆盖重写此方法 public synchronized void start(): 线程开始执行; 多次调用同一个线程的此方法是不合法的。 public static native void sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停暂时停止执行具体取决于系统定时器和调度程序的精度和准确性。 线程不会丢失任何CPU的所有权。 //线程休眠5S Thread.sleep(5000); public static void sleep(long millis, int nanos) :使当前正在执行的线程以指定的毫秒数加上指定的纳秒数暂停暂时停止执行 public final String getName():返回此线程的名称 Thread.currentThread().getName();//获取当前线程名称public final synchronized void setName(String name):将此线程的名称更改为等于参数name public final int getPriority():返回此线程的优先级 public final void setPriority(int newPriority):更改此线程的优先级,1~10之间 public final native boolean isAlive():测试这个线程是否活着。 如果一个线程已经启动并且尚未死亡那么线程是活着的 public static void main(String[] args) {Runnable runnable new Runnable() {Overridepublic void run() {for (int i 0; i 3; i) {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};Thread thread new Thread(runnable);// isAlive()测试这个线程是否活着System.out.println(thread.isAlive()); // falsethread.start();// 线程启动后尚未结束时返回 trueSystem.out.println(thread.isAlive()); // true }public final void join():等待线程死亡等同于join(0)public final synchronized void join(long millis):等待这个线程死亡的时间最多为millis毫秒。 0的超时意味着永远等待 join可以理解为当我们调用某个线程的这个方法时这个方法会挂起调用线程直到被调用线程结束执行调用线程才会继续执行。(让父线程等待子线程结束之后才能继续运行) public static void main(String[] args){Thread th new Thread(runnable);th.start();try {// 在main执行 main线程等待 th 执行完毕后再执行th.join();// main线程等待 th 执行 1s 后再执行 // th.join(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(main end);}public void interrupt():中断这个线程线程的中断状态标记为 true public static boolean interrupted():测试当前线程是否中断。 该方法可以清除线程的中断状态(设置中断状态为False) 。 换句话说如果这个方法被连续调用两次那么第二个调用将返回false除非当前线程再次中断在第一个调用已经清除其中断状态之后在第二个调用之前已经检查过。 public boolean isInterrupted():测试这个线程是否被中断。 线程的中断状态不受此方法的影响。不清除中断状态。 public static void main(String[] args) {Runnable runnable new Runnable() {Overridepublic void run() {Thread thread Thread.currentThread();for (int i 0; i 10; i) {if (i % 3 0) {// 中断线程 标记线程中断状态thread.interrupt();}// 测试当前线程是否中断System.out.println(Thread.interrupted());//true false false true false false true false false true}int count 0;while (!thread.isInterrupted()) {if (count 5) {// 当count 5 时线程就会被中断thread.interrupt(); // 我想停}System.out.println(执行 count ); // 执行0 执行1 执行2 执行3 执行4 执行5}}};Thread thread new Thread(runnable);thread.start(); }public static native void yield():导致当前执行线程处于让步状态。如果有其他可运行线程具有至少与此线程同样高的优先级那么这些线程接下来会被调度。并不一定会让出去。 public State getState():返回此线程的状态,返回值是Thread的一个内部类枚举类State。线程状态可以是 NEW: 尚未启动的线程处于此状态。RUNNABLE: 在Java虚拟机中执行的线程(可以运行的线程)处于此状态。BLOCKED: 被阻塞等待监视器锁定的线程处于此状态。WAITING: 正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING: 正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。 (sleep(1000),join(1000))TERMINATED: 已退出的线程处于此状态。
http://www.dnsts.com.cn/news/255613.html

相关文章:

  • 江苏网站建设网络推广和文化有关的吉网站建设模板
  • 网站上的截图怎么做建设flash网站
  • 网站在建设中是什么意思宁波网站建设公司哪家好
  • 温州营销网站公司电话网站更换空间改版收录
  • 重庆网站建设论坛旅游网页制作模板教程
  • 网站建设多少钱裙网络营销是什么?
  • 禁止wordpress网站上传图片时自动生成三张图片方法上海建设工程学校网站
  • wordpress主题 清新深圳网站seo
  • 网站怎样做seoui设计与制作
  • 仿win8 html5微网站纯手工代码wordpress查版本
  • 会网站建设好吗广东省农业农村厅官网首页
  • 美团网站怎么做奉贤做网站
  • 常州网站建设段新浩怎样在百度上发布作品
  • 信息免费建站网站有哪些店铺设计费用怎么收费
  • 网站如何做视频为网站开发
  • 网站建设信息推荐重庆网站建设培训班
  • 电影网站空间配置传奇手游网页版
  • 984网站建设项目手机免费建设网站
  • 互联网开发是做什么的搜索引擎关键字排名优化
  • 网站导入网站建设所需要的软件
  • 17一起做网店网站潮汕黄页推广
  • 嘉定制作企业网站百度右边相关网站
  • 教育培训网站源码怎么发布自己的网站
  • 怎么查网站的浏览量内蒙古呼和浩特特产
  • 瑞诺国际做外贸网站好吗做网站类网站费用
  • 长沙专业公司网站建设源头seo计费系统源码
  • 网站开发基本构成相城专业的网站建设
  • jsp网站开发详解书籍wordpress新主题去版权
  • 产品包装设计素材网站影视公司宣传片
  • wex5可以做网站吗网站建设方案的策划书