Xin chào mọi người, trong bài đăng này, chúng ta sẽ xem xét cách giải quyết Gọi một Phương thức trong Đối tượng Chủ đề đang chạy bằng Giải pháp Mã trong lập trình
class SomeClass { Graphic_handler grap; public static void main[String[] args] { Graphic_handler grap = new Graphic_handler[bot]; ^^^^ this *hides* the other grap grap.start[]; } }
Có nhiều cách để giải quyết cùng một vấn đề Gọi một phương thức trong một đối tượng luồng đang chạy với các giải pháp mã. Các giải pháp khác được khám phá dưới đây
class SomeClass { Graphic_handler grap; public static void main[String[] args] { grap = new Graphic_handler[bot]; grap.start[]; } }
Nhiều ví dụ đã giúp chúng tôi hiểu cách khắc phục lỗi Gọi phương thức trong đối tượng luồng đang chạy với giải pháp mã
Chúng ta có thể gọi phương thức chạy trực tiếp trong luồng không?
Phương thức run[] có sẵn trong lớp luồng được xây dựng bằng một đối tượng Runnable riêng biệt. Mặt khác, phương thức này không làm gì cả và trả về. Chúng ta có thể gọi phương thức run[] nhiều lần. 16-Nov-2021
Điều gì sẽ xảy ra nếu chúng ta gọi phương thức run thay vì bắt đầu trên đối tượng luồng?
Phương thức chạy chỉ là một phương thức khác. Nếu bạn gọi nó trực tiếp, thì nó sẽ không thực thi trong luồng khác mà trong luồng hiện tại. Nếu start không được gọi thì Thread được tạo sẽ không bao giờ chạy. Chủ đề chính sẽ kết thúc và Chủ đề sẽ được thu gom rác. 10-Dec-2013
Cần phải làm gì để gọi phương thức run[] trên một luồng cho một đối tượng bắt nguồn từ lớp luồng?
Giải trình. Lựa chọn A là đúng. Phương thức run[] cho một luồng giống như phương thức main[] cho một ứng dụng. Bắt đầu luồng làm cho phương thức chạy của đối tượng được gọi trong luồng thực thi riêng biệt đó
Phương pháp nào được sử dụng để xác định nếu một luồng đang chạy?
Giải trình. Phương thức isAlive[] được sử dụng để kiểm tra xem luồng được gọi có đang chạy hay không, ở đây luồng là phương thức main[] đang chạy cho đến khi chương trình kết thúc do đó nó trả về true. 10
Chúng ta có thể gọi trực tiếp phương thức chạy trong chuỗi trong Java không?
Không, bạn không thể gọi trực tiếp phương thức chạy để bắt đầu một chuỗi. Bạn cần gọi phương thức bắt đầu để tạo một luồng mới. Nếu bạn gọi trực tiếp phương thức run, nó sẽ không tạo một luồng mới và nó sẽ nằm trong cùng một ngăn xếp với chính
Chúng ta có thể gọi phương thức chạy hai lần trong luồng không?
Không. Sau khi bắt đầu một chủ đề, nó không bao giờ có thể được bắt đầu lại. Nếu bạn làm như vậy, một IllegalThreadStateException sẽ bị ném ra. Trong trường hợp như vậy, luồng sẽ chạy một lần nhưng lần thứ hai, nó sẽ ném ngoại lệ
Phương thức nào được thực thi khi phương thức start[] của đối tượng luồng được gọi?
Phương thức start[] gọi nội bộ phương thức run[] của giao diện Runnable để thực thi mã được chỉ định trong phương thức run[] trong một luồng riêng biệt
Tại sao chúng ta cần cả hai phương thức run[] & Start[]?
Như chúng ta biết rằng start[] và run[] là hai phương thức quan trọng của đa luồng và một phương thức được sử dụng để tạo một luồng mới trong khi phương thức kia được sử dụng để bắt đầu thực thi luồng đó. 18-Tháng 9-2019
Đâu là sự khác biệt giữa việc gọi phương thức start[] và run[] của luồng?
Tóm lại, điểm khác biệt duy nhất giữa phương thức start[] và run[] trong Thread là start tạo một luồng mới trong khi quá trình chạy không tạo bất kỳ luồng nào và chỉ thực thi trong luồng hiện tại giống như một lệnh gọi phương thức thông thường. Tại sao các phương thức đợi và thông báo được khai báo trong Lớp đối tượng?
Cho đến nay, chúng ta đã sử dụng một luồng bằng cách khởi tạo lớp Thread được cung cấp bởi gói [luồng. py]. Để tạo luồng của riêng chúng tôi trong Python, chúng tôi sẽ muốn làm cho lớp của chúng tôi hoạt động như một luồng. Đối với điều này, chúng ta nên phân lớp lớp của chúng tôi từ lớp Thread
Điều đầu tiên chúng ta cần làm là nhập Chủ đề bằng mã sau
from threading import Thread
Sau đó, chúng ta nên phân lớp lớp của mình từ lớp Thread như thế này
class MyThread[Thread]:
Chỉ để tham khảo, đây là đoạn mã từ gói dành cho lớp Chủ đề
class Thread: ... def start[self]: """Start the thread's activity. It must be called at most once per thread object. It arranges for the object's run[] method to be invoked in a separate thread of control. This method will raise a RuntimeError if called more than once on the same thread object. """ if not self._initialized: raise RuntimeError["thread.__init__[] not called"] if self._started.is_set[]: raise RuntimeError["threads can only be started once"] with _active_limbo_lock: _limbo[self] = self try: _start_new_thread[self._bootstrap, []] except Exception: with _active_limbo_lock: del _limbo[self] raise self._started.wait[] def _bootstrap[self]: try: self._bootstrap_inner[] except: if self._daemonic and _sys is None: return raise def _bootstrap_inner[self]: try: ... try: self.run[] except SystemExit: pass except: def run[self]: try: if self._target: self._target[*self._args, **self._kwargs] finally: # Avoid a refcycle if the thread is running a function with # an argument that has a member that points to the thread. del self._target, self._args, self._kwargs
Khi một Chủ đề khởi động, nó thực hiện một số khởi tạo cơ bản và sau đó gọi phương thức run[] của nó, phương thức này gọi hàm mục tiêu được truyền cho hàm tạo. Lớp Thread đại diện cho một hoạt động chạy trong một luồng điều khiển riêng biệt. Có hai cách để xác định hoạt động
- bằng cách chuyển một đối tượng có thể gọi được tới hàm tạo
- bằng cách ghi đè phương thức run[] trong một lớp con
Không có phương thức nào khác [ngoại trừ hàm tạo] được ghi đè trong một lớp con. Nói cách khác, chúng ta chỉ ghi đè các phương thức __init__[] và run[] của một lớp
Trong phần này, chúng ta sẽ tạo một lớp con của Thread và ghi đè run[] để làm bất cứ điều gì cần thiết
import threading class MyThread[threading.Thread]: def run[self]: pass if __name__ == '__main__': for i in range[3]: t = MyThread[] t.start[]
Khi một đối tượng luồng được tạo, hoạt động của nó phải được bắt đầu bằng cách gọi phương thức start[] của luồng. Điều này gọi phương thức run[] trong một luồng điều khiển riêng biệt
Khi hoạt động của chuỗi được bắt đầu, chuỗi được coi là 'còn sống'. Nó ngừng hoạt động khi phương thức run[] của nó kết thúc - thông thường hoặc bằng cách đưa ra một ngoại lệ chưa được xử lý. Phương thức is_alive[] kiểm tra xem thread còn sống hay không
import threading import time class MyThread[threading.Thread]: def run[self]: time.sleep[5] return if __name__ == '__main__': for i in range[3]: t = MyThread[] t.start[] print 't.is_alive[]=', t.is_alive[] t.join[] print 't.is_alive[]=', t.is_alive[]
đầu ra
t.is_alive[]= True t.is_alive[]= False t.is_alive[]= True t.is_alive[]= False t.is_alive[]= True t.is_alive[]= False
Như chúng ta có thể thấy từ đầu ra, mỗi luồng trong số ba luồng vẫn còn hoạt động ngay sau khi bắt đầu nhưng t. is_alive[]=False sau khi kết thúc
Trước khi tiếp tục, để thuận tiện, hãy đặt tính năng ghi nhật ký vào một nơi
________số 8đầu ra
[Thread-1 ] running [Thread-2 ] running [Thread-3 ] running
Truyền đối số cho chuỗi tùy chỉnh
Bởi vì các giá trị *args và **kwargs được chuyển đến hàm tạo của Thread được lưu trong các biến riêng tư, nên chúng không dễ dàng truy cập được từ một lớp con. Để chuyển các đối số cho một loại luồng tùy chỉnh, chúng ta cần xác định lại hàm tạo để lưu các giá trị trong một thuộc tính cá thể có thể nhìn thấy trong lớp con