并发编程基础知识篇--线程的状态和基本操作

目录

创建线程的四种方式

线程的状态和生命周期

扩展知识

线程的调度

线程状态的基本操作

interrupted

实例

join

实例 

sleep

实例

扩展小知识

yield

实例 

扩展


创建线程的四种方式

创建线程的四种方式

  1. 继承Thread类
  2. 实现Runnable接口
  3. 使用Callable和Future创建线程
  4. 使用Executor框架创建线程池

创建线程的具体实现可以参考Java进阶篇--创建线程的四种方式

线程的状态和生命周期

在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期。当Thread对象创建完成时,线程的生命周期便开始了。当run()方法中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时,线程的生命周期便会结束。线程整个生命周期可以分为五个阶段,分别是新建状态(New)就绪状态(Runnable)运行状态(Running)阻塞状态(Blocked)死亡状态(Terminated),线程的不同状态表明了线程当前正在进行的活动。

在程序中,通过一些操作,可以使线程在不同状态之间转换。

上图展示了线程各种状态的转换关系,箭头表示可转换的方向,其中,单箭头表示状态只能单向的转换,例如,线程只能从新建状态转换到就绪状态,反之则不能;双箭头表示两种状态可以互相转换,例如,就绪状态和运行状态可以互相转换。

接下来针对线程生命周期中的五种状态分别进行详细讲解,具体如下:

1.新建状态(New)

创建一个线程对象后,该线程对象就处于新建状态,此时它不能运行,和其他Java对象一样,仅仅由Java虚拟机为其分配了内存,没有表现出任何线程的动态特征。

2.就绪状态(Runnable)

当线程对象调用了start()方法后,该线程就进入就绪状态。处于就绪状态的线程位于线程队列中,此时它只是具备了运行的条件,能否获得CPU的使用权并开始运行,还需要等待系统的调度。

3.运行状态(Running)

如果处于就绪状态的线程获得了CPU的使用权,并开始执行run()方法中的线程执行体,则该线程处于运行状态。一个线程启动后,它可能不会一直处于运行状态,当运行状态的线程使用完系统分配的时间后,系统就会剥夺该线程占用的CPU资源,让其他线程获得执行的机会。需要注意的是,只有处于就绪状态的线程才可能转换到运行状态。

4.阻塞状态(Blocked)

一个正在执行的线程在某些特殊情况下,如被人为挂起或执行耗时的输入/输出操作时,会让出CPU的使用权并暂时中止自己的执行,进入阻塞状态。线程进入阻塞状态后,就不能进入排队队列。只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。

5.死亡状态(Terminated)

当线程调用stop()方法或run()方法正常执行完毕后,或者线程抛出一个未捕获的异常(Exception)、错误(Error),线程就进入死亡状态。一旦进入死亡状态,线程将不再拥有运行的资格,也不能再转换到其他状态。

扩展知识

线程在运行状态与阻塞状态之间的转换是由于特定的条件和操作引起的。下面是一些线程从运行状态转换为阻塞状态的常见原因:

  1. 等待I/O:当线程执行需要等待输入/输出操作完成时,例如读取文件、网络通信等,它会被阻塞。
  2. 获得锁失败:当线程尝试获取一个被其他线程持有的锁时,它会被阻塞,直到锁可用。
  3. 等待其他线程完成:线程可能需要等待其他线程执行完特定的操作或达到特定的条件,才能继续执行。
  4. 调用 sleep() 方法:线程可以调用 Thread.sleep() 方法进入阻塞状态,暂停一段指定时间。
  5. 调用 wait() 方法:线程可以在对象上调用 wait() 方法,使其进入阻塞状态,直到其他线程调用相同对象的 notify() 或 notifyAll() 方法。

要将线程从阻塞状态转换为就绪状态,需要满足特定的条件或操作:

  1. I/O 操作完成:当线程所需的输入/输出操作完成时,它会从阻塞状态返回到就绪状态。
  2. 锁可用:当线程等待的锁变为可用时,它会从阻塞状态返回到就绪状态,并尝试再次获取锁以继续执行。
  3. 其他线程通知:当其他线程调用相同对象的 notify() 或 notifyAll() 方法时,等待该对象的线程会从阻塞状态返回到就绪状态,然后竞争获得对象的锁以继续执行。
  4. sleep() 时间到期:当调用 Thread.sleep() 方法的线程休眠时间到期时,它会从阻塞状态返回到就绪状态。
  5. wait() 被唤醒:当其他线程调用相同对象的 notify() 或 notifyAll() 方法,或者调用 wait(long timeout) 的时间到期时,等待该对象的线程会从阻塞状态返回到就绪状态。

注意:线程从阻塞状态只能进入就绪状态,而不能直接进入运行状态,也就是说结束阻塞的线程需要重新进入可运行池中,等待系统的调度。

线程的调度

在计算机系统中,线程调度是操作系统或虚拟机对线程执行顺序和运行时间的管理。

  1. 分时调度模型:在这种模型中,所有的线程会轮流地获得CPU的使用权。每个线程会被分配一个时间片,当这个时间片用完之后,下一个线程就会获得CPU的使用权。这种模型的优点是可以让每个线程都有机会运行,从而实现公平的资源分配。然而,如果一个线程需要长时间运行,那么其他线程就需要等待它完成,这可能会导致程序的响应速度变慢。
  2. 抢占式调度模型:在这种模型中,操作系统会选择优先级高的线程来运行。如果线程的优先级相同,那么操作系统会随机选择一个线程来运行。当这个线程失去了CPU的使用权后,操作系统会选择另一个线程来运行。这种模型的优点是可以提高程序的响应速度,因为优先级高的线程可以更快地获得CPU的使用权。然而,如果一个线程长时间运行,那么其他线程就需要等待它完成,这可能会导致资源的浪费。
  3. Java虚拟机的调度模型:Java虚拟机默认采用抢占式调度模型。它使用了优先级调度算法来决定线程的执行顺序,并且可以通过设置线程的优先级来影响调度的结果。Java提供了一些方法来控制线程的调度,如Thread.yield() 方法可以让当前线程主动放弃CPU的使用权,以便给其他线程执行的机会。

注意:通常情况下,程序员不需要关心这个过程,因为Java虚拟机会自动处理。但是,在一些特定的需求下,可能需要改变这种模式,由程序自己来控制CPU的调度。这可以通过使用Java的Thread类和相关的API来实现。

线程状态的基本操作

interrupted

中断是一种协作机制,用于在多线程环境中控制程序的执行。中断标志位是一种内部状态,用于表示线程是否被中断。当一个线程被中断时,中断标志位将被设置为true,并且会抛出InterruptedException异常。

  1. public void interrupt():用于中断该线程对象。调用该方法会将线程的中断标志位设置为true。如果该线程被调用了Object wait()、Object wait(long)、Thread.sleep(long)、Thread.join()、Thread.join(long)等方法时,会抛出InterruptedException并清除中断标志位。
  2. public boolean isInterrupted():用于测试该线程对象是否被中断。调用该方法可以检查当前线程的中断状态,并返回一个boolean值,表示线程是否被中断。调用该方法不会清除中断标志位。
  3. public static boolean interrupted():用于测试当前线程是否被中断。调用该静态方法可以检查当前线程的中断状态,并返回一个boolean值,表示当前线程是否被中断。调用该方法会清除中断标志位(即将中断标志位设置为false)。

在使用这些方法时需要注意以下几点:

  1. 调用interrupt()方法会将线程的中断标志位设置为true。
  2. 被中断的线程可以通过调用isInterrupted()方法来感知其他线程对其自身的中断操作,并做出相应的响应。
  3. 当抛出InterruptedException时,会清除线程的中断标志位。
  4. 调用interrupted()方法会清除当前线程的中断标志位。

实例

下面结合具体的实例来看一看

public class Main {public static void main(String[] args) {Thread myThread = new MyThread();myThread.start(); // 启动线程try {Thread.sleep(2000); // 主线程休眠2秒} catch (InterruptedException e) {e.printStackTrace();}myThread.interrupt(); // 中断线程}private static class MyThread extends Thread {@Overridepublic void run() {while (!isInterrupted()) {System.out.println("线程正在运行...");try {Thread.sleep(500); // 线程休眠500毫秒} catch (InterruptedException e) {e.printStackTrace();break; // 捕获到InterruptedException时退出循环,结束线程执行}}System.out.println("线程已经中断...");}}
}

输出结果 

线程正在运行...
线程正在运行...
线程正在运行...
线程正在运行...
java.lang.InterruptedException: sleep interruptedat java.base/java.lang.Thread.sleep(Native Method)at 练习.Main$MyThread.run(Main.java:22)
线程已经中断...

在上面的示例中,我们创建了一个继承自Thread类的MyThread类,它重写了run()方法来定义线程的执行逻辑。在run()方法中,我们通过检查线程的中断状态(isInterrupted())来决定是否退出循环。同时,在每次循环中,线程会休眠500毫秒(Thread.sleep(500))。

在Main类的main()方法中,我们创建了一个MyThread的实例,并调用start()方法开启线程。主线程随后休眠2秒,然后调用myThread.interrupt()方法中断线程。当线程被中断时,它将捕获到InterruptedException并退出循环,最后输出一条提示信息。

因此,中断操作可以看做线程间一种简便的交互方式。一般在结束线程时通过中断标志位或者标志位的方式可以有机会去清理资源,相对于武断而直接的结束线程,这种方式要优雅和安全。

join

join()是Java中的一个方法,它用于让一个线程等待另一个线程执行完成。当一个线程调用另一个线程的join()方法时,它将会被阻塞,直到被调用的线程执行完毕。

join()方法有以下几种重载形式:

  1. public final void join() throws InterruptedException:当前线程调用另一个线程的join()方法,会使当前线程进入阻塞状态,直到被调用的线程执行完成。如果被调用的线程发生中断,则会抛出InterruptedException异常。
  2. public final synchronized void join(long millis) throws InterruptedException:当前线程调用另一个线程的join(long millis)方法,会使当前线程进入阻塞状态,最多等待指定的时间(毫秒)。如果被调用的线程在指定的时间内执行完毕,则当前线程恢复运行;如果超过指定的时间仍未执行完毕,当前线程也会恢复运行。
  3. public final synchronized void join(long millis, int nanos) throws InterruptedException:与上一种形式类似,但允许指定纳秒级别的额外等待时间。

通过使用join()方法,可以实现多个线程之间的协同工作和结果的合并。例如,主线程可以调用某个子线程的join()方法来等待子线程执行完毕,然后再继续执行主线程的后续逻辑。

实例 

下面是一个简单示例,演示了join()方法的用法:

public class Main {public static void main(String[] args) {Thread thread1 = new MyThread("Thread 1");Thread thread2 = new MyThread("Thread 2");thread1.start();thread2.start();try {thread1.join(); // 主线程等待thread1执行完成thread2.join(); // 主线程等待thread2执行完成} catch (InterruptedException e) {e.printStackTrace();}System.out.println("所有线程都已完成.");}private static class MyThread extends Thread {public MyThread(String name) {super(name);}@Overridepublic void run() {System.out.println(getName() + " 已启动.");try {Thread.sleep(2000); // 线程休眠2秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getName() + " 已完成.");}}
}

输出结果为:

Thread 1 已启动.
Thread 2 已启动.
Thread 1 已完成.
Thread 2 已完成.
所有线程都已完成.

sleep

在Java中,sleep()方法用于使当前线程休眠(暂停执行)一段时间。它是Thread类的静态方法,可以通过线程对象或直接通过类名调用。

sleep()方法有两种重载形式:

  1. sleep(long millis)这种形式表示当前线程休眠指定的毫秒数。
  2. sleep(long millis, int nanos)这种形式表示当前线程休眠指定的毫秒数和纳秒数。纳秒数范围是0到999999。

使用sleep()方法时需要处理InterruptedException异常,因为其他线程调用了当前线程的interrupt()方法会中断当前线程的休眠。

实例

下面是一个简单的示例,演示了如何使用sleep()方法:

public class Main {public static void main(String[] args) {System.out.println("主线程开始执行");try {Thread.sleep(2000); // 当前线程休眠2秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("主线程继续执行");}
}

输出结果可能如下所示:

主线程开始执行  //(等待2秒)
主线程继续执行

通过sleep()方法,我们可以控制线程的暂停时间,用于实现一些需要等待一段时间后再执行的逻辑。

需要注意的是,sleep()方法不会释放对象锁,因此其他线程无法获得被当前线程持有的锁。如果在多线程环境下使用sleep()方法,需要注意并发访问共享资源的同步问题。

扩展小知识

sleep方法经常拿来与Object.wait()方法进行比较,这也是面试经常被问的地方。

sleep()方法和wait()方法在Java中用于不同的目的,尽管它们都可以暂停线程的执行,但有一些重要的区别。

相同点:

  • 都可以使当前线程暂停执行一段时间。

区别点:

1.来源和使用方式:

  • sleep()方法是Thread类的静态方法,可以直接通过线程对象或类名调用。它用于在指定的时间段内使当前线程休眠。
  • wait()方法是Object类的实例方法,必须在同步代码块/方法中使用,通过调用对象的wait()方法来暂停当前线程,同时释放对象锁。

2.调用位置:

  • sleep()方法可以在任意位置的代码中调用,无需获得对象锁。
  • wait()方法必须在同步代码块/方法中调用,因为它会释放对象锁,并等待被其他线程通过notify()、notifyAll()方法唤醒。

3.被唤醒机制:

  • sleep()方法在指定的时间到达后自动唤醒当前线程,然后该线程进入就绪状态等待CPU时间片。其他线程无法直接唤醒通过sleep()方法暂停的线程。
  • wait()方法需要等待其他线程调用相同对象的notify()或notifyAll()方法来唤醒当前线程。

4.锁的释放:

  • sleep()方法不释放对象锁,即使线程休眠,其他线程仍无法获得被当前线程持有的锁。
  • wait()方法会释放对象锁,让其他线程进入对象的同步代码块/方法。

综上所述,sleep()方法主要用于线程的时间调度和暂停执行一段时间,而wait()方法主要用于线程间的协作和等待特定条件满足后再继续执行。选择使用哪种方法取决于具体的需求和场景。

yield

yield()是Java中的一个方法,它用于提示线程调度器当前线程愿意放弃对CPU的使用权。当一个线程调用yield()方法时,它就会让出自己的时间片,告诉调度器可以先执行其他优先级相同或更高的线程。

1.调用方式:

  • yield()方法是Thread类的静态方法,可以直接通过线程对象或类名调用。
  • 例如,Thread.yield(); 或者 Thread.currentThread().yield();

2.功能和作用:

  • yield()的作用是暂停当前正在执行的线程,并给予其他等待线程执行的机会。
  • 调用yield()方法的线程进入就绪状态,等待调度器重新选择执行。

3.调度器行为:

  • 调用yield()方法不保证当前线程会立即暂停执行,也无法保证其他线程会立即得到执行。
  • 具体的调度器行为取决于操作系统和Java虚拟机的实现,可能有一定的优化策略。

4.适用场景:

  • yield()方法常用于协助线程间的合理调度,尤其在具有相同优先级且需要公平共享CPU资源的情况下。
  • 它可以用于避免某个线程过度占用CPU资源,提高系统的整体性能和公平性。

需要注意的是,yield()方法不能保证在多线程程序中达到精确的任务调度顺序。它只是一种提示机制,告诉调度器当前线程有一定的让步意愿。实际上,调度器可以忽略这个提示而继续执行当前线程。

总结:yield()方法允许当前线程主动放弃对CPU的使用权,以促进其他线程的执行。然而,由于具体的调度行为取决于操作系统和虚拟机的实现,因此不应将yield()方法作为实现严格的线程间协作和任务调度顺序的方式。

另外需要注意的是,sleep()和yield()方法,同样都是当前线程会交出处理器资源,而它们不同的是,sleep()交出来的时间片其他线程都可以去竞争,也就是说都有机会获得当前线程让出的时间片。而yield()方法只允许与当前线程具有相同优先级的线程能够获得释放出来的CPU时间片。

实例 

以下是一个简单的Java代码示例,演示了如何使用yield()方法:

public class Main implements Runnable {@Overridepublic void run() {for (int i = 1; i <= 5; i++) {System.out.println(Thread.currentThread().getName() + ": " + i);// 使用yield()方法让出CPU资源Thread.yield();}}public static void main(String[] args) {// 创建两个线程对象Thread thread1 = new Thread(new Main());Thread thread2 = new Thread(new Main());// 启动两个线程thread1.start();thread2.start();}
}

在上述示例中,我们创建了一个名为YieldExample的类,实现了Runnable接口。在run()方法中,每个线程都会打印数字1到5,并在每次循环后调用yield()方法来让出CPU资源。

在main()方法中,我们创建了两个线程对象并启动它们。由于线程调度器的具体行为无法确定,因此无法预测哪个线程在某一次循环中会先执行。然而,通过使用yield()方法,我们鼓励线程之间进行公平的CPU资源共享。

请注意,由于线程调度的不确定性,运行示例代码可能会产生不同的输出结果。可以通过多次运行代码来观察这种不确定性和共享CPU资源的行为。

扩展

线程状态的基本操作还包括以下几种:

  1. start:启动线程,调用线程对象的start()方法。
  2. run:在start()方法调用后,线程进入可运行状态,当线程调度选中该线程时,run()方法开始执行。
  3. resume:恢复阻塞状态的线程,使该线程回到就绪状态。
  4. block:将当前线程放入一个阻塞队列中,进入阻塞状态。
  5. newLock:获取新的锁,使线程进入等待状态,直到获得锁为止。
  6. lock:获取锁,如果锁已经被其他线程持有,则当前线程进入等待状态,直到获得锁为止。
  7. unlock:释放锁,使等待该锁的线程能够获得锁并继续执行。
  8. destroy:销毁线程对象,使该线程处于死亡状态。

这些操作都是线程状态转换的基本操作,可以帮助我们更好地管理和控制线程的执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618779.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

win7笔记本无线网服务器,win7笔记本连接不上无线网络

有些时候我们在使用win7笔记本&#xff0c;难免会遇到连接不上无线网络的情况&#xff0c;这是怎么回事呢?下面就由学习啦小编来为你们简单的介绍win7笔记本连接不上无线网络的解决方法吧! win7笔记本连接不上无线网络的解决方法 Win7右下角的无线图标为但还是连接不上的话&am…

win7计算机建立无线网络连接不上,教你电脑连接不上无线网络怎么办

最近有网友反馈&#xff0c;遇到了笔记本无法连接无线网络的问题。笔记本如果连接不了WiFi&#xff0c;这样就会带来很多不便。其实导致电脑连接不上无线网络的原因有很多&#xff0c;接下来就让小编教你电脑连接不上无线网络怎么办吧。 电脑连接不上无线网络怎么办&#xff1a…

Win10电脑连接不上无线网络怎么解决

为了电脑使用方便&#xff0c;很多网友都会给电脑连接上无线网络来上网&#xff0c;但是电脑遇到连不上网络怎么办呢&#xff1f;今天给大家分享一个方法&#xff0c;大家遇到无线网络连接不上问题可以参考一下。 系统&#xff1a;win10专业版 电脑&#xff1a;联想Ideapad 7…

Win10笔记本电脑连接不上WiFi的解决办法

笔记本电脑连接不上WiFi是很多朋友会遇到的一个问题,而产生的原因也很多,解决起来相对麻烦一些,需要了解导致的原因与排查方法。最近小编的Win10笔记本电脑也遇到了类似的无线网络连接不可用的问题,不过通过排查很快就解决了,下面小编分享一下详细的Win10笔记本电脑连接不…

禁用计算机的网络连接无线网络连接不上,win7笔记本电脑无线网络连接不上怎么解决?...

最近有不少网友都遇到了win7笔记本电脑无线网络连接不上的问题。我们都知道&#xff0c;无线网络是可以共享的&#xff0c;笔记本无线网络连接不上&#xff0c;我们就无法有进一步的操作了。那么&#xff0c;win7笔记本电脑无线网络连接不上怎么解决呢?接下来&#xff0c;小编…

深度学习怎么学?

推荐这本小白看的《深度学习&#xff1a;从基础到实践&#xff08;上下册&#xff09;》。 深度学习&#xff1a;从基础到实践&#xff08;上下册&#xff09; 深入浅出的讲述了深度学习的基本概念与理论知识&#xff0c;不涉及复杂的数学内容&#xff0c;零基础小白也能轻松掌…

笔记本计算机无法上无线网络,告诉你解决笔记本电脑连不上无线网络

在科技快速发展的今天&#xff0c;无线网络给我们的生活带来了极大的方便&#xff0c;正是因为有无线网卡的存在&#xff0c;才使得笔记本电脑能够开启WiFi&#xff0c;成为移动热点。不过也有用户会遇到笔记本电脑连不上无线网络的情况&#xff0c;该怎么去解决呢&#xff1f;…

禁用计算机的网络连接无线网络连接不上,笔记本电脑无线网络连接不上是什么原因...

笔记本电脑无线网络连接不上是什么原因&#xff1f;笔记本电脑连接不上无线网络的原因&#xff0c;有以下几种可能&#xff1a;1、无线网络密码不正确&#xff1b;2、无线网络缓存问题&#xff1b;3、路由器上进行了限制。 笔记本电脑无线网络连接不上 一、无线网络密码不正确 …

笔记本电脑连接不上WiFi怎么办?4个实用解决方法!

案例&#xff1a;笔记本电脑连接不上WiFi怎么办 “朋友们&#xff0c;想问问大家知道为什么我的笔记本电脑连接不上WiFi呢&#xff1f;试了好几遍还是无法连接&#xff0c;遇到这种情况我应该怎么解决呢&#xff1f;感谢大家&#xff01;” 在现代生活中&#xff0c;笔记本电…

网络能搜索计算机但不能连接不上,笔记本能搜到无线网络但连接不上怎么办

现在的无线网络已经是随处可见了&#xff0c;手机和电脑也都能够通过连接无线进行上网&#xff0c;不过有一些用户是例外的&#xff0c;下面学习啦小编教大家 笔记本能搜到无线网络但连接不上的解决方法&#xff0c;供您参考。 笔记本能搜到无线网络但连接不上的解决方法 首先…

怎样开启计算机无线网络连接不上,电脑连接不上无线网络,详细教您解决笔记本电脑连不上无线网络...

在科技快速发展的今天&#xff0c;无线网络给我们的生活带来了极大的方便&#xff0c;正是因为有无线网卡的存在&#xff0c;才使得笔记本电脑能够开启WiFi&#xff0c;成为移动热点。不过也有用户会遇到笔记本电脑连不上无线网络的情况&#xff0c;该怎么去解决呢&#xff1f;…

联想i5无线网无法连接服务器,联想笔记本无线网络连接不上是什么原因

原因&#xff1a; ①、要看看是不是硬件问题&#xff0c;比如&#xff1a;无线网卡、路由器、电脑有一样出现异常就可能导致无线网络连接不上。 ②、要看看无线网络是否没开&#xff0c;很多笔记本为了省电&#xff0c;设计时默认了无线网络开关&#xff0c;所以&#xff0c;要…

为什么计算机连不上无线网络,笔记本无线连不上是什么原因_为什么笔记本电脑连不上wifi-win7之家...

在使用笔记本电脑的时候&#xff0c;我们经常喜欢连接无线wifi网络来使用&#xff0c;然而有时候可能会遇到笔记本无线连不上的情况&#xff0c;很多用户不知道是什么原因引起的&#xff0c;那么为什么笔记本电脑连不上wifi呢&#xff1f;原因有多种&#xff0c;接下来为大家讲…

API管理风险:如何确保您的API安全与可靠?

API管理风险&#xff1a;如何确保您的API安全与可靠&#xff1f; 随着数字化时代的到来&#xff0c;应用程序接口&#xff08;API&#xff09;在现代软件开发中发挥着关键的作用。然而&#xff0c;API管理过程中存在着各种潜在的风险。本文将探讨如何有效地管理和缓解这些风险…

win7计算机建立无线网络连接不上,Win7笔记本无线网络连接不上如何解决?

随着网络的不断发展&#xff0c;无线网络已经随处可见了。而现在的笔记本都有内置的无线网卡&#xff0c;只要有WiFi的热点还有知道无线密码就可以登录了。最近&#xff0c;有Win7系统的用户&#xff0c;在使用电脑上网的时候&#xff0c;发现无线网络连接不上。这是怎么回事&a…

笔记本计算机无法上无线网络,笔记本电脑无线网络连接不上原因有哪些【详细介绍】...

随着人们对网络信息技术的信赖,越来越多的人越来越依赖网络,连吃饭都通过互联网来订购,一旦笔记本电脑无线网络连接不上,就像发生了什么大事,赶紧去找 笔记本电脑 无线网络连接不上原因 ,我们应该怎么办呢?下面就让小编来为大家详细介绍 笔记本电脑无线网络连接不上原因…

stm32之25.FLASH闪存

打开标准库 源码--- int main(void) {uint32_t d;Led_init();key_init();/* 初始化串口1波特率为115200bps&#xff0c;若发送/接收数据有乱码&#xff0c;请检查PLL */usart1_init(115200);printf("this is flash test\r\n");/* 解锁FLASH&#xff08;闪存&#xf…

如何让qt tableView每个item中个别字用不同颜色显示?

如何让qt tableView每个item中个别字用不同颜色显示&#xff1f; 从上面图片可以看到&#xff0c;Item为红色&#xff0c;数字5为黑色。 要实现在一个控件实现不同颜色&#xff0c;目前想到的只有QTextEdit 。有两种方法&#xff0c;第一种是代理&#xff0c;第二种是通过setI…

聚来宝:APP带你玩转移动4G购物时代

本新闻由21CN财经报道&#xff0c;媒体原文链接&#xff1a;http://finance.21cn.com/stock/cfgd/a/2014/1008/17/28342115.shtml 移动4G的来临加速移动互联网的发展&#xff0c;为移动购物注入了前所未有的活力。目前&#xff0c;移动购物正逐步替代PC端购物将成为最新最便捷的…

如何网购最高返利18%——如何成为聚来宝网购会员

如何网购获取返利 ◆聚来宝是什么: 聚来宝是互联网上所有知名网上商城的汇聚之地, 聚来宝是个购物返利导航网站, 注册会员通过这个网站进入到淘宝网和天猫商城及1000家大型网站购物 (比如:京东,凡客,当当,1号店,亚马…