精华内容
下载资源
问答
  • JavaWeb 服务启动时,在后台启动加载一个线程。 目前,我所掌握一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动启动的Servlet。 下面对这两种方法做一简单介绍,(Mark一下,防止以后...

    JavaWeb 服务启动时,在后台启动加载一个线程。

    目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet。

    下面对这两种方法做一简单的介绍,(Mark一下,防止以后急用又忘记了):

    1.监听(Listener)
    首先,我们创建一个监听的类,继承ServletContextListener,如下:

    package com.wxp.thread;
     
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
     
    /**
     * Listener的方式在后台执行一线程
     * 
     * @author Champion.Wong
     * 
     */
    public class MyListener implements ServletContextListener {
    	private MyThread myThread;
     
    	public void contextDestroyed(ServletContextEvent e) {
    		if (myThread != null && myThread.isInterrupted()) {
    			myThread.interrupt();
    		}
    	}
     
    	public void contextInitialized(ServletContextEvent e) {
    		String str = null;
    		if (str == null && myThread == null) {
    			myThread = new MyThread();
    			myThread.start(); // servlet 上下文初始化时启动 socket
    		}
    	}
    }
     
    /**
     * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
     * 
     * @author Champion.Wong
     * 
     */
    class MyThread extends Thread {
    	public void run() {
    		while (!this.isInterrupted()) {// 线程未中断执行循环
    			try {
    				Thread.sleep(2000); //每隔2000ms执行一次
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			
    //			 ------------------ 开始执行 ---------------------------
    			System.out.println("____FUCK TIME:" + System.currentTimeMillis());
    		}
    	}
    }

    然后再web.xml重配置

    <listener>
    	<listener-class>com.wxp.thread.MyListener</listener-class>
    </listener>

    OK,启动项目,我们可以在控制台看到隔时间段输出的文字内容。

    2.使用Servlet,在项目启动的时候启动它。
    首先,创建一个Servlet,继承HttpServlet

    package com.wxp.thread;
     
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.ite.common.Constants;
     
    public class MyServlet extends HttpServlet{
     
        private static final long serialVersionUID = 1L;
        private MyThread1 myThread1;
        
        public MyServlet(){
        }
     
        public void init(){
        	String str = null;
    		if (str == null && myThread1 == null) {
    			myThread1 = new MyThread1();
    			myThread1.start(); // servlet 上下文初始化时启动 socket
    		}
        }
     
        public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
            throws ServletException, IOException{
        }
     
        public void destory(){
        	if (myThread1 != null && myThread1.isInterrupted()) {
        		myThread1.interrupt();
    		}
        }
    }
     
    /**
     * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
     * 
     * @author Champion.Wong
     * 
     */
    class MyThread1 extends Thread {
    	public void run() {
    		while (!this.isInterrupted()) {// 线程未中断执行循环
    			try {
    				Thread.sleep(2000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			
    			// ------------------ 开始执行 ---------------------------
    			System.out.println("____FUCK TIME:" + System.currentTimeMillis());
    		}
    	}
    }

    在web.xml中进行配置

    <!-- LISTENER FOR THREAD -->
    <servlet>
    	<servlet-name>MyListener</servlet-name>
    	<servlet-class>com.ite.wxp.MyServlet</servlet-class>
    	<load-on-startup>9</load-on-startup><!-- 数字越小,启动的优先级越高,必须大于0 -->
    </servlet>
    <servlet-mapping>  
            <servlet-name>MyListener</servlet-name>  
            <url-pattern>/test</url-pattern>   
    </servlet-mapping>

      其中,Listener的方式,该线程肯定是项目中首先启动的,优先于任何一个Servlet。而Servlet的方式,可以设置与其它Servlet启动的顺序。如果有时候需要首先启动一个Servlet或者它们之间的启动顺序有特殊要求的时候,这个就很有作用了。

     

    转载:https://blog.csdn.net/it_wangxiangpan/article/details/7168286

    展开全文
  • 有时开启一个线程是为了把耗时的操作转移到线程中执行,主进程中可以执行其它的任务,避免了因为大量的重复性操作导致主进程阻塞。 控制线程暂停的方法线程的同步用到了QMutex类,作为一个互斥锁控制进行保护。...

    需要线程停止的目的:

    有时开启一个线程是为了把耗时的操作转移到线程中执行,主进程中可以执行其它的任务,避免了因为大量的重复性操作导致主进程阻塞。

    控制线程暂停的方法:

    线程的同步用到了QMutex类,作为一个互斥锁控制进行保护。如果在主进程中把线程里面的互斥锁获取,那么线程中再次获取该锁就会失败,引起线程阻塞,主进程执行操作结束后,释放该锁,线程就会再次启动。以上思路实现了线程的暂停和开启。

    具体实现代码:

    1、线程中代码框架

    void thread::run(){
        mutex.lock();    //获得锁
        /*********/
        /........../
        mutex.unlock();  //释放锁
    }

    2、主进程中代码

    void mainwindows::doSomething(){
        thread.mutex.lock();
        /*****************/
        thread.mutex.unlock();
    }

    中途停止线程的方法

    Qt线程的停止可通过三种方式实现:

    1、利用quit(或者exit(0))

    this.quit();

    2、使用terminate

    this.terminate();

    this.wait();

    3、利用volatile

            一种是使用标志位,这种方法最好,在while循环中使用标志位判断是否满足进行循环的条件,并在run函数结束时将stoped置为初始化的值false。(stop定义:volatile bool stopped)

    第三中方法线程还在运行,只不过运行的内容是空的。

    测试第二中方法可以实现中途停止线程。

    展开全文
  • 如何启动一个线程

    2020-02-03 18:10:27
    启动一个线程必须调用方法来启动,也就是调用Thread类的start()方法、而不是调用run()方法的原因是:run()中包含的是线程的主体,也就是这个线程被启动后将要运行的代码,它和线程的启动没有任何关系。 标题2:...

    标题1:如何启动一个线程

    启动一个线程必须调用方法来启动,也就是调用Thread类的start()方法、而不是调用run()方法的原因是:run()中包含的是线程的主体,也就是这个线程被启动后将要运行的代码,它和线程的启动没有任何关系。

    标题2:Thread类中的start()方法和run()方法的区别

    start()方法用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thread类的start()方法来启动的线程处于就绪状态(可运行状态),此时并没有真正的运行,只有一旦得到CPU时间片,才会自动开始执行run()方法。

    run()方法只是线程里的一个函数(也称为线程体),而不是多线程的。如果直接调用run()方法,其实就相当于是调用了一个普通函数而已。直接调用run()方法必须等待run()方法执行完后才能执行下面的代码,所以执行路径还是只有一条,这样就没有达到写线程的目的。所以在多线程执行时要使用start()方法去启动线程而不是run()方法。

    把需要处理的代码放到run()方法中,start()方法启动线程将自动调用run()方法,这个由java的内存机制规定的。并且run()方法必须是public的访问权限,返回值为void。

    展开全文
  • 本人新手小白: 一个方法里面启动的线程,是不是一定要等线程跑完了才能跑完这个方法
  • 下面例子使用了不同方式完成了同样事情。 实现Runnnable方式: void startAThread0() { new Thread(new MyRunnable()).start(); } class MyRunnable implements Runnable { public void ...
    下面的三个例子使用了不同的方式完成了同样的事情。
    
    实现Runnnable的方式:
    void startAThread0() {
      new Thread(new MyRunnable()).start();
    }
     
    class MyRunnable implements Runnable {
      public void run() {
        ...
      }
    }


    继承Thread的方式:
    void startAThread1() { new MyThread().start(); } class MyThread extends Thread { public void run() { ... } }


    匿名继承Thread的方式:
    void startAThread2() { new Thread() { public void run() { ... } }.start(); }

    不要直接调用run()方法。总是调用Thread.start()方法,这个方法会创建一条新的线程并使新建的线程调用run()。

     

    转载于:https://www.cnblogs.com/mr-wuxiansheng/p/7666835.html

    展开全文
  • 如果直接调用run()方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到多线程的目的。 start方法运行...
  • 一个java程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体操作。Thread、Runnable开启线程是主线程下子线...
  • 我们知道,我们通过调用线程的start方法启动一个线程,那么,我们可以直接调用run方法启动一个线程吗? 先看下面一段代码:public class Test { public static void main(String[] args) { // TODO Auto-...
  • java方法启动一个的线程

    万次阅读 2017-12-20 10:45:15
    1 要想在java方法启动一个线程。通过new Thread(){public void run(){...}}.start()即可。 如:public static void main(String[] args) { System.out.println("新建议一个线程"); //启动一个线程 ...
  • JavaWeb 服务启动时,在后台启动加载一个线程。 目前,我所掌握一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动启动的Servlet。 下面对这两种方法做一简单介绍,(Mark一下,防止...
  • 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。 ...
  • java开启新线程的三种方法方法1:继承Thread类 ...4):在main方法(线程)中,创建一个线程对象并启动线程。 (1)创建线程类对象: A类 a = new A类(); (2)调用线程对象的start方法: a.start();...
  • MFC启动一个线程的三种方法

    千次阅读 2019-03-11 16:40:39
    转载于:... 第一种AfxBeginThread() 用AfxBeginThread()函数来创建一个新线程来执行任务,工作者线程的AfxBeginThread的原型如下: CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, ...
  • 一个java程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体操作。Thread、Runnable开启线程是主线程下子线程,是父子关系,此时该...
  • //注意ParameterizedThreadStart委托定义形式 t.Start(new string[] { "Oh","My","God" }); Console.WriteLine("线程继续执行"); Thread.Sleep(1000); t.Abort(); t.Join();//阻塞Main线程,直到t终止 ...
  • 实现一个线程的方法

    2018-06-01 16:52:37
    进程是指一个内存中运行应用程序,每个进程都有自己独立一块内存空间,一个进程中可以启动多个线程。...那么,在我们程序中定义或者说创建一个线程要怎么写呢?共有一下两种方法:1 扩展java.l...
  • 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。 API解释如下: ...
  • 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。 run()方法是线程启动后要进行回调(callback)的方法。...
  • public static void main(String[] args) { ...//获取线程信息的方法 ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false,false); for(ThreadInfo threadInfo:threadInfos){ System.out.p
  • start( )方法是不是只能用于启动可以线程,还有什么其他方面用法吗
  • 定义并启动一个线程

    2018-04-27 11:17:57
    runnable接口只定义了一个run方法用来包含在线程中执行的方法。Runnable对象被传递给Thread的构造函数,如下HelloRunnable示例:public class HelloRunnable implements Runnable { public void ru...
  • 一般来说,JVM会启动个线程,比如 [5] Aattach listener线程//负责接收到外部命令,而对该命令进行执行并且吧结果返回给发送者 [4] Signal Dispatcher // 分发处理发送给JVM信号线程 [3] Finalizer // ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program ... static void Main(string[]...
  • VC启动一个线程的三种方法

    万次阅读 2015-03-14 19:53:43
    用CreateThread()函数创建线程将返回一个线程句柄,通过该句柄你可以控制和操作该线程,当你不用时可以一创建该线程后就关闭该句柄,有专门函CloseHandle()。关闭句柄不代表关闭线程,只是你不能在外部控制该...
  • 线程的实现方法 实现Runable接口 继承Theradl类 实现Callable接口 线程池 synchronized的用法 修饰一个代码块,被修饰的代码块称为同步代码块,其锁可以进行自定义对象或类. ...启动一个线程是调用run()还...
  • 创建和启动一个线程

    2016-03-19 17:34:11
    、定义线程  1、继承java.lang.Thread类。  此类中有run()方法,应该注意其用法:  public void run() 如果该线程是使用独立 Runnable 运行对象构造,则调用该 Runnable 对象 run 方法;否则,该...
  • Android启动线程的方法

    2017-04-16 23:41:11
    方法1:定义一个线程需要新建一个类并且继承Thread,然后重写父类run()方法,并在其中增加耗时逻辑即可。 定义线程:class MyThread extends Thread{ public void run(){ ......//耗时逻辑 } }启动线程:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,747
精华内容 4,698
关键字:

启动一个线程的方法