多线程——创建新线程

一,简单单线程

线程是代码的执行序列或者执行路径。线程与进程的概念有一些类似,它类似于一个轻量级的进程;一个操作系统可以运行多个进程,一个进程内可以运行多个线程。每个应用程序至少运行在一个线程上。当只有一个线程时,称作单线程应用程序,该线程由系统自动创建。

下面看一个简单单线程例子:

如上图,本短程序从入口函数main进入,然后一次执行到结束。

执行main方法的线程通常被成为主线程,主线程的入口也是应用程序的起始点。对于单线程的应用程序来说,代码的执行是顺序的。

但是在多线程中,当新线程被手动开启之后,主线程将不再等待被开启的新线程,直接执行后面的代码。

二,创建新线程入口方法

下面来介绍两种为两种入口方法来进入新线程:

首先,引入线程的基本操作类:

下面是创建线程的方法:

namespace workerThreadTest
{
    class Program
    {
        static void Main(string[] args)
        {

            #region ThreadStart定义无参数的入口方法

                //ThreadStart ts = new ThreadStart(ThreadEntry);//新建立线程的入口
                //Thread worker = new Thread(ts);
                //worker.Start();  //调用Thread的start方法启动线程;
                ////start方法是非阻塞的,被调用之后会立即返回
                ////调用start后,新线程并非立即执行,这取决于操作系统的线程管理策略,
                ////只不过这个时间非常短,感觉上好像新线程立即执行了。

                //Console.WriteLine("main thread ends");
                //Console.ReadKey();

            #endregion

            #region ParameterizedThreadStart委托

            //ParameterizedThreadStart定义的方法参数为object类型,因此在线程的入口方法ThreadEntry内部需要进行一下类型转换

                ParameterizedThreadStart ts = new ParameterizedThreadStart(ThreadEntry);
                Thread worker = new Thread(ts);
                string[] obj = { "item3","item4"};
                worker.Start(obj);  //开启有参数线程

                Console.WriteLine("main thread ends");
                Console.ReadKey();

            #endregion

        }

        static void ThreadEntry(object obj)
        {

            ShareResource resource = new ShareResource();
            string[] itemArray = (string[])obj;
            foreach (string item in itemArray)
            {
                resource.Add(item);
            }

        }

        //要开启的新线程
        static void ThreadEntry() {

            ShareResource resource = new ShareResource();
            resource.Add("item");//加入资源

        }
    }

    public class ShareResource
    {
        public List<string> list = new List<string> { "Item0", "Item1", "Item2" };

        public void Add(string item)
        {
            Console.WriteLine("Add:" + item);
            list.Add(item);
        }

    }

}

创建一个新线程可以使用上述两种方法:ThreadStart方法和ParameterizedThreadStart方法,这两个方法分别定义了无参数的入口方法和有参数的入口方法。

时间: 2024-10-21 04:42:50

多线程——创建新线程的相关文章

关于Executors.newFixedThreadPool何时创建新线程

Executors.newFixedThreadPool 本意是创建一个固定大小的线程池,但这个线程池是什么执行的呢? 1.当一个任务提交执行后,就会先判断是否线程池的数量已经达到上限,如果没有则创建新的线程来执行任务,即使原来创建过的线程是空闲的也不会使用.看源码:     private boolean addIfUnderCorePoolSize(Runnable firstTask) {         Thread t = null;         final ReentrantLo

多线程编程之Windows环境下创建新线程

在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是C++ 运行库的函数.为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题.而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的"全局"量. 所以,如果你的编程只调用 Win32 API/SDK ,就放心用 CreateThread:如

Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性

Thread实现多线程: public class Thread2 extends Thread{ public  int i; public void run(){ for(; i < 100 ;i++) { System.out.println(getName() + " " + i); } } public static void main(String[] args){ for (int j = 0; j < 100; j++) { System.out.print

jfinal afterJFinalStart中执行长久循环操作的解决方案:创建新线程

很多时候,需要在jfinal中afterJFinalStart方法中,写一些需要一直循环运行的程序,做一些循环操作.但是在afterJFinalStart中,执行时间过长的话,会导致整个站点启动超时. 解决方案是,新建一个新的线程,在afterJFinalStart中启动即可: 1 package com.thread; 2 3 import com.activeMQ.ActiveMQHelper; 4 import com.demo.testSpring.Animal; 5 6 /** 7 *

java核心学习(二十一) 多线程---创建启动线程的三种方式

本节开始java多线程编程的学习,对于操作系统.进程.线程的基本概念不再赘述,只是了解java对于多线程编程的支持有哪些. 一.继承Thread类来创建线程 java语言中使用Thread类来代表线程,代表线程的类可以通过继承Thread类并重写run()方法来实现多线程开发,调用线程类实例的start方法来启动该线程.下面来试一试 package ThreadTest; public class FirstThread extends Thread{ private int i; public

1、Java多线程-创建线程

1.使用Runnable接口 Runnable是执行工作的独立任务,不返回任何值 a.定义任务 1 /** 2 * Runnable接口,实现一个简单的线程 3 */ 4 public class LiftOff implements Runnable { 5 protected int countDown =10; // Default 6 private static int taskCount = 0; 7 private final int id = taskCount++; 8 9 p

Java多线程系列--“JUC线程池”01之 线程池架构

概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容——线程池.内容包括:线程池架构图线程池示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html 线程池架构图 线程池的架构图如下: 1. Executor 它是"执行者"接口,它是来执行任务的.准确的说,Executor提供了execute()接口来执行

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

Java多线程系列--“JUC线程池”02之 线程池原理(一)

ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合.线程池允许同时运行的线程数量就是线程池的容量:当添加到线程池中的线程超过它的容量时,会有一部分线程阻塞等待.线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理." ThreadPoolExecutor数据结构 ThreadPoolExecutor的数据结构如下图所示: 各个数据在ThreadPoolExecutor