多线程创建

多线程

1. 创建线程的方式

 public static void main(String[] args)
    {
        //1.显示继承Thread类,重写run方法
        myThread t1 = new myThread();
        t1.start();//启动线程
        //2.使用匿名内部类实现 Thread接口
        Thread t2 = new Thread()
        {
            @Override
            public void run()
            {
               System.out.println("使用匿名内部类实现 Thread接口");
            }
        };
        //3.实现Runnable接口
        Thread t3 = new Thread(new myRunnable());
        t3.start();
        //4.使用匿名内部类实现Runnable接口
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
			System.out.println("使用匿名内部类实现Runnable接口");
            }
        };
        Thread t4 = new Thread(runnable);
        t4.start();
    }

    //1.显示继承Thread类,重写run方法
    static class myThread extends Thread
    {
        @Override
        public void run()
        {
             System.out.println("显示继承Thread类,重写run方法");
        }
    }

    //3.实现Runnable接口
    static class myRunnable implements Runnable
    {
        @Override
        public void run()
        {
            System.out.println("实现Runnable接口");
        }
    }

2. 线程的6种状态

2.1 NEW(新建)

​ 当用new操作符创建一个新线程时,如new Thread®,该线程还没有开始运行。这意味着它的状态是new。当一个线程处于新创建状态时,程序还没有开始运行线程中的代码。在线程运行之前还有一些基础工作要做。

2.2 Runnable(可运行)

​ 一旦调用start方法,线程将处于runnable状态。一个可运行的线程可能正在运行也可能没有运行,这取决于操作系统给线程提供运行的时间。(Java的规范说明没有将它作为一个单独状态。一个正在运行中的线程仍然处于可运行状态)

在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行(这就是为什么将这个状态称为可运行而不是运行。

2.3 Blocked(阻塞)

当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态。

2.4 Waiting(等待)

当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。

2.5 Timed waiting(计时等待)

有几个方法有一个超时参数。调用它们导致线程进入计时等待态。这一状态将一直保持到超时期满或者接收到适当的通知。

2.6 Terminated(终止)

线程已经结束,但是其对象还未被销毁

image-20210801171935226

3.线程属性

3.1 中断线程

当对一个线程调用interrupt方法时,就会设置线程中断状态。这是每个线程都有的boolean标志

我们在中断线程时有两种方式,一种是等待当前线程本次任务结束后再中断,一种则是遇到 interrupt方法 后立即中断

我们以转账为例,代码如下

方式1:

static boolean isQuit = false;

public static void main(String[] args)
{
    Thread t1 = new Thread()
    {
        @Override
        public void run()
        {
            while (!isQuit)
            {
                System.out.println("正在转账");
                try
                {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    };
    t1.start();//启动线程
    try
    {
        //让主线程休眠5000ms
        Thread.sleep(5000);
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }
    System.out.println("终止交易");
    //温和方式结束线程
    isQuit = true;
}

方式2:

public static void main(String[] args)
{
    Thread t1 = new Thread()
    {
        @Override
        public void run()
        {
            //Thread.currentThread().isInterrupted() 判断当前线程是否设置了中断状态
            while (!Thread.currentThread().isInterrupted())
            {
                System.out.println("正在转账");
                try
                {
                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                    break;
                }
            }
        }
    };
    t1.start();
    try
    {
        //让main方法的线程休眠5000
        Thread.sleep(5000);
    }
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }
    System.out.println("终止交易");
    //立即中断线程
    t1.interrupt();//设置中断状态为true
}

如果线程被阻塞,就无法检测中断状态。这是产生 InterruptedException异常的地方。当在一个被阻塞的线程(调用sleep或wait)上调用interrupt方法时,阻塞调用将会被Interrupted Exception 异常中断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Duilib 是一个基于 C++ 的 UI 框架,支持多线程创建。在 Duilib 中,使用多线程创建 UI 界面可以提高程序的响应速度,增强用户体验。下面是一个简单的多线程创建 UI 界面的示例代码: ```c++ #include "stdafx.h" #include <Windows.h> #include "DuiLib/UIlib.h" using namespace DuiLib; class CMainFrame : public WindowImplBase { public: CMainFrame() {} virtual ~CMainFrame() {} virtual CDuiString GetSkinFolder() { return _T("skin"); } virtual CDuiString GetSkinFile() { return _T("MainWnd.xml"); } virtual LPCTSTR GetWindowClassName(void) const { return _T("DUIMainFrame"); } virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (uMsg == WM_CREATE) { // 创建子线程 HANDLE hThread = CreateThread(NULL, 0, ThreadProc, this, 0, NULL); CloseHandle(hThread); } return 0; } static DWORD WINAPI ThreadProc(LPVOID lpParameter) { CMainFrame* pThis = (CMainFrame*)lpParameter; // 在子线程中创建 UI 界面 pThis->Create(NULL, _T("Duilib 多线程创建示例"), WS_OVERLAPPEDWINDOW, WS_EX_WINDOWEDGE); pThis->ShowWindow(true); pThis->CenterWindow(); return 0; } }; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CMainFrame mainFrame; mainFrame.Create(NULL, _T("Duilib 多线程创建示例"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); mainFrame.CenterWindow(); mainFrame.ShowWindow(true); CPaintManagerUI::MessageLoop(); return 0; } ``` 在上述代码中,我们在主线程中创建了一个 `CMainFrame` 对象,并调用了 `Create` 方法创建了主窗口。在主窗口的 `HandleCustomMessage` 方法中,我们调用了 `CreateThread` 函数创建了一个子线程,并在子线程中调用了 `Create` 方法创建了一个 UI 界面。这样,我们就实现了在多线程创建 UI 界面的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值