스레드는 프로그램의 실행 경로로 정의됩니다. 각 스레드는 고유한 흐름 제어를 정의합니다. 애플리케이션에 데이터베이스 액세스나 일부 집중적인 I/O 작업과 같이 복잡하고 시간이 많이 걸리는 작업이 포함된 경우 각 스레드가 특정 작업을 수행하는 다양한 실행 경로나 스레드를 설정하는 것이 매우 유용한 경우가 많습니다.
스레드는 가벼운 프로세스입니다. 스레드 사용의 일반적인 예는 최신 운영 체제에서 병렬 프로그래밍을 구현하는 것입니다. 스레드를 사용하면 CPU 주기 손실이 줄어들고 애플리케이션 효율성이 향상됩니다.
지금까지 우리가 컴파일한 프로그램은 애플리케이션의 실행 인스턴스인 스레드에서 단일 프로세스로 실행됩니다. 그러나 이러한 응용 프로그램은 한 번에 하나의 작업만 수행할 수 있습니다. 여러 작업을 동시에 수행하려면 더 작은 스레드로 나눌 수 있습니다.
.Net에서 스레드는 'System.Threading' 네임스페이스를 통해 처리됩니다. system.threading.thread 유형의 변수를 생성하면 새 스레드를 생성하고 작업을 시작할 수 있습니다. 이를 통해 별도의 스레드에서 독립적인 스레드를 생성하고 액세스할 수 있습니다.
스레드는 스레드 개체에서 생성되고 해당 생성자에는 스레드 시작에 대한 참조가 제공됩니다.
ThreadStart childthreat = new ThreadStart(childthreadcall);
스레드의 수명 주기는 system.threading.thread 클래스의 객체가 생성될 때 시작되고 스레드가 종료되거나 실행이 완료될 때 끝납니다.
다음은 스레드 수명 주기의 다양한 상태입니다.
시작 보류 상태: 스레드 인스턴스가 생성되었지만 시작 메서드가 호출되지 않았습니다.
준비 상태(Ready State): 스레드가 실행할 준비가 되어 CPU 주기를 기다리는 상황입니다.
실행 불가능 상태: 스레드를 실행할 수 없는 경우 다음과 같은 여러 가지 가능성이 있습니다.
현재 수면 방법은 다음과 같습니다.
대기 메소드가 호출됩니다.
I/O 작업으로 인해 차단됨
사망 상태: 스레드가 실행을 완료했거나 종료되었습니다.
Thread 클래스의 우선순위 속성은 주로 다른 스레드에 상대적인 스레드의 우선순위를 지정합니다. .NET 런타임은 우선 순위가 가장 높은 준비된 스레드를 선택합니다. 우선순위는 다음과 같이 나눌 수 있습니다.
정상보다 높다
평소보다 낮음
제일 높은
가장 낮은
정상
스레드가 생성되면 시스템은 Thread 클래스의 우선순위 설정 시스템을 사용하여 우선순위를 설정합니다.
NewThread.Priority = ThreadPriority.Highest;
스레드 클래스에는 다음과 같은 중요한 기능이 있습니다.
재산 | 설명하다 |
---|---|
현재컨텍스트 | 현재 실행 중인 스레드의 내용을 가져옵니다. |
현재문화 | 현재 스레드의 환경을 가져오거나 설정합니다. |
현재원칙 | 현재 프로세스의 역할 기반 보안 정책을 가져오거나 설정합니다. |
현재스레드 | 현재 실행 중인 스레드를 가져옵니다. |
현재UI문화 | 현재 실행 중인 프로세스의 리소스 관리자가 특정 리소스를 찾기 위해 사용하는 현재 환경을 가져오거나 설정합니다. |
실행 컨텍스트 | 현재 스레드에 대한 상황별 정보가 포함된 ExecutionContext 개체를 가져옵니다. |
살아있다 | 현재 스레드의 실행 상태를 나타내는 값을 가져옵니다. |
배경 | 배경 스레드가 배경 스레드인지 여부를 나타내는 값을 가져오거나 설정합니다. |
IsThreadPool스레드 | 스레드가 관리되는 스레드 풀에 속하는지 여부를 나타내는 값을 가져옵니다. |
관리되는 스레드 ID | 관리되는 스레드의 현재 고유 식별자를 가져옵니다. |
이름 | 스레드 이름을 가져오거나 설정합니다. |
우선 사항 | 스레드의 예약 우선 순위를 나타내는 값을 가져오거나 설정합니다. |
스레드 상태 | 현재 스레드의 상태가 포함된 값을 가져옵니다. |
스레드 클래스에는 다음과 같은 중요한 메서드가 있습니다.
방법 | 설명하다 |
---|---|
중단 | ThreadAbortException을 호출하면 스레드 종료 프로세스가 시작됩니다. 이 메서드를 호출하면 일반적으로 스레드가 종료됩니다. |
데이터슬롯 할당 | 모든 스레드에는 명명되지 않은 데이터 슬롯이 할당됩니다. 성능을 향상하려면 ThreadStaticAttribute 특성이 표시된 필드를 사용하세요. |
명명된 데이터 슬롯 할당 | 모든 스레드에 명명된 데이터 슬롯을 할당합니다. 성능을 향상하려면 ThreadStaticAttribute 특성이 표시된 필드를 사용하세요. |
BeginCriticalRegion | 스레드 중단 또는 처리되지 않은 예외로 인해 다른 작업이 손상될 수 있는 코드 영역으로 실행이 곧 진입할 것임을 호스트에 알립니다. |
BeginThread친화성 | 현재 물리적 운영 체제 스레드의 ID에 따라 관리 코드가 곧 실행될 것임을 호스트에 알립니다. |
EndCriticalRegion | 실행이 스레드 중단 또는 처리되지 않은 예외가 현재 작업에만 영향을 미치는 코드 영역으로 진입하려고 함을 호스트에 알립니다. |
EndThreadAffinity | 현재 물리적 운영 체제 스레드의 ID에 따라 관리 코드 실행이 완료되었음을 호스트에 알립니다. |
FreeNamedDataSlot | 프로세스의 모든 스레드에 대한 이름과 슬롯 간의 연결을 제거합니다. 성능을 향상하려면 ThreadStaticAttribute 특성이 표시된 필드를 사용하세요. |
데이터 가져오기 | 현재 스레드의 현재 도메인에 있는 현재 스레드가 지정한 슬롯에서 값을 검색합니다. 성능을 향상하려면 ThreadStaticAttribute 특성이 표시된 필드를 사용하세요. |
도메인 가져오기 | 현재 도메인에서 현재 실행 중인 스레드를 반환합니다. |
도메인ID 가져오기 | 고유한 애플리케이션 도메인 식별자를 반환합니다. |
명명된 데이터 슬롯 가져오기 | 명명된 데이터 슬롯을 찾습니다. 성능을 향상하려면 ThreadStaticAttribute 특성이 표시된 필드를 사용하세요. |
방해하다 | WaitSleepJoin 스레드 상태에서 스레드를 중단합니다. |
가입하다 | 표준 COM 및 SendMessage 실행을 계속하면서 스레드 중 하나가 종료될 때까지 호출 스레드를 차단합니다. 이 메서드에는 다양한 오버로드된 형식이 있습니다. |
메모리 배리어 | 동기식 메모리 액세스는 다음과 같습니다. 현재 스레드를 처리하는 가속기는 메모리 액세스가 MemoryBarrier를 호출한 후 메모리 액세스 실행을 호출하는 방식으로 명령을 재정렬할 수 없습니다. |
재설정중단 | 현재 스레드의 중단 요청을 취소합니다. |
데이터 설정 | 지정된 시간 슬롯에서 현재 실행 중인 스레드에 대한 데이터와 해당 스레드의 현재 도메인을 설정합니다. 더 나은 성능을 위해 애플리케이션 도메인에는 도메인의 ThreadStaticAttribute 특성이 있습니다. |
시작 | 스레드를 시작합니다. |
잠 | 스레드가 일정 기간 동안 일시 중지됩니다. |
스핀대기 | 매개변수에 정의된 반복 횟수만큼 스레드를 기다리게 합니다. |
휘발성읽기() | 필드의 값을 읽습니다. 최신 값은 프로세서 또는 프로세서 캐시 상태 번호에 관계없이 컴퓨터의 모든 프로세서에 의해 기록됩니다. 이 메서드에는 다양한 오버로드된 형식이 있습니다. |
휘발성쓰기() | 컴퓨터의 모든 프로세서에 표시되는 필드에 값을 즉시 씁니다. 이 메서드에는 다양한 오버로드된 형식이 있습니다. |
생산하다 | 호출 스레드가 현재 프로세서에서 실행될 수 있는 다른 스레드를 실행하도록 하고 운영 체제는 스레드를 리디렉션하도록 선택합니다. |
다음 예제에서는 스레드 클래스의 사용을 보여줍니다. 페이지에는 하위 스레드의 메시지를 표시하는 컨트롤 레이블이 있습니다. 기본 프로그램의 메시지는 response.write(50) 메서드를 사용하여 직접 표시되므로 페이지 상단에 나타납니다.
소스 파일은 다음과 같습니다.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="threaddemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> 제목 없는 페이지 </title> </head> <body> <form id="form1 " runat="server"> <div> <h3>스레드 예</h3> </div> <asp:Label ID="lblmessage" runat="server" Text="Label"> </asp:Label> < /양식> </body> </html>
배경 코드는 다음과 같습니다.
System.Collections 사용, System.Linq 사용, System.Web.UI.HtmlControls 사용 ; System.Web.UI.WebControls.WebParts 사용; System.Xml.Linq 사용; 네임스페이스 threaddemo; class _Default : System.Web.UI.Page { protected void Page_Load(객체 전송자, EventArgs e) { ThreadStart childthreat = new ThreadStart(childthreadcall) Response.Write("하위 스레드 시작됨 <br/>"); Thread(childthreat); child.Start(); Response.Write("기본 2초 동안 잠자기 상태입니다....<br/>"); Thread.Sleep(2000); Response.Write("<br/>주요 하위 스레드 중단<br/>"); child.Abort() } public void childthreadcall() { try{ lblmessage.Text = "<br/ >하위 스레드 시작됨 <br/>"; lblmessage.Text += "하위 스레드: 10으로 연결 중"; for( int i =0; i<10; i++) { Thread.Sleep(500); lblmessage.Text += "<br/> 하위 스레드 </br>" } lblmessage.Text += "<br/> 하위 스레드 완료"; catch(ThreadAbortException e){ lblmessage.Text += "<br /> 하위 스레드 - 예외" }마지막으로{ lblmessage.Text += "<br /> 하위 스레드 - 예외를 포착할 수 없습니다." } } } }
페이지가 로드되면 childthreadcall()을 참조로 사용하여 새 스레드가 시작됩니다. 메인 스레드의 활동은 웹 페이지에 직접 표시됩니다.
두 번째 스레드가 실행되어 메시지를 제어 태그로 보냅니다.
하위 스레드가 실행되는 동안 기본 스레드는 2000밀리초 동안 대기합니다.
하위 스레드는 기본 스레드에 의해 종료될 때까지 계속 실행된 다음 ThreadAbortException을 발생시키고 종료됩니다.
제어는 메인 스레드로 돌아갑니다.
프로그램이 실행되면 다음 정보를 보냅니다.