Xem Nhiều 3/2023 #️ Jsp] Lập Trình Java Servlet Cơ Bản P5: Forward (Chuyển Tiếp) Và Redirect (Chuyển Hướng) Servlet # Top 9 Trend | Sansangdethanhcong.com

Xem Nhiều 3/2023 # Jsp] Lập Trình Java Servlet Cơ Bản P5: Forward (Chuyển Tiếp) Và Redirect (Chuyển Hướng) Servlet # Top 9 Trend

Cập nhật thông tin chi tiết về Jsp] Lập Trình Java Servlet Cơ Bản P5: Forward (Chuyển Tiếp) Và Redirect (Chuyển Hướng) Servlet mới nhất trên website Sansangdethanhcong.com. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất.

Trong bài viết này chúng ta sẽ tìm hiểu cách Servlet Forward (Chuyển tiếp) và Servlet Redirect (Chuyển hướng). Phân biệt giữa Forward và Redirect cùng các ví dụ minh họa.

Để thực hiện được hướng dẫn này, bạn cần đọc và thực hiện những hướng dẫn ở bài viết trước:

1. Tạo WebProject đầu tiên

2. Cấu hình eclipse

3. Tạo và chạy Servlet đầu tiên

1. Forward (Chuyển tiếp)

Chuyển tiếp (Forward): Khi một yêu cầu (request) của trình duyệt gửi tới một Servlet, nó có thể chuyển tiếp yêu cầu tới một trang khác (hoặc một servlet khác). Địa chỉ trên trình duyệt của người dùng vẫn là đường dẫn của trang đầu tiên, nhưng nội dung của trang do trang được chuyển tiếp tới tạo ra. Trang được chuyển tiếp tới bắt buộc phải là môt trang (hoặc Servlet) nằm trong ứng dụng web của bạn. Với Forward bạn có thể sử dụng request.setAttribute() để truyền dữ liệu từ trang 1 sang trang thứ 2.

ForwardDemoServlet.java

package org.o7planning.tutorial.servlet.other; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.o7planning.tutorial.beans.Constants; @WebServlet("/other/forwardDemo") public class ForwardDemoServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String forward = request.getParameter("forward"); if ("true".equals(forward)) { System.out.println("Forward to ShowMeServlet"); request.setAttribute(Constants.ATTRIBUTE_USER_NAME_KEY, "Hi, I'm Tom come from Walt Disney !"); RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher("/showMe"); dispatcher.forward(request, response); return; } ServletOutputStream out = response.getOutputStream(); out.println("- servletPath=" + request.getServletPath()); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }

Chạy lại Webserver và chạy lần lượt 2 URL:

Trong trường hợp 1: Không có forward, dữ liệu nhìn thấy trên trang là của ForwardDemoServlet tạo ra.

Trường hợp 2: Có chuyển tiếp (forward) sang servlet ShowMeServlet. Trong trường hợp này URL trên trang là không đổi, trong khi dữ liệu là của ShowMeServlet tạo ra.

Forward (chuyển tiếp) thường được sử dụng trong một số tình huống chẳng hạn người dùng yêu cầu servlet A, tuy nhiên trang này bắt buộc phải login trước, trong servlet A kiểm tra thấy nếu chưa login thì chuyển tiếp sang servlet Login.

Quay lại với RequestDispatcher, chúng ta có 2 cách để lấy đối tượng RequestDispatcher.

Trường hợp request.getServletContext().getRequestDispatcher(url) trả về RequestDispatcher có vị trí tương đối với contextPath (có vị trí tương đối với thư mục gốc của website).

http://localhost:8080/contextPath

http://localhost:8080/ServletTutorial

Còn gọi request.getRequestDispatcher(url) trả về RequestDispatcher có vị trí tương đối với trang hiện tại.

http://localhost:8080/ServletTutorial/other/forwardDemo

Chú ý:

Redirect (Chuyển hướng) cho phép bạn chuyển hướng tới các trang bao gồm cả các trang nằm ngoài Website.

Forward (Chuyển tiếp) chỉ cho phép chuyển tới các trang nằm trong Website, đồng thời có thể chuyển dữ liệu giữa 2 trang thông qua request.setAttribute.

2. Redirect (Chuyển hướng)

Chuyển hướng (Redirect): Khi một yêu cầu (request) từ phía người dùng tới một Servlet (Trang A), servlet này có thể chuyển yêu cầu này tới một trang khác (Trang B), và kết thúc nhiệm vụ của nó. Trang được chuyển hướng tới có thể là trang trong ứng dụng của bạn, hoặc có thể là một trang bất kỳ. Địa chỉ trên trình duyệt của người dùng lúc này sẽ hiển thị đường dẫn của trang B. Khác với chuyển tiếp (Forward). Với Redirect bạn không thể sử dụng request.setAttribute(..) để truyền dữ liệu từ trang A sang trang B.

ShowMeServlet.java

package org.o7planning.tutorial.servlet.other; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.o7planning.tutorial.beans.Constants; @WebServlet("/showMe") public class ShowMeServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String value = (String) request.getAttribute(Constants.ATTRIBUTE_USER_NAME_KEY); ServletOutputStream out = response.getOutputStream(); out.println(value); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }

RedirectDemoServlet.java

package org.o7planning.tutorial.servlet.other; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/other/redirectDemo") public class RedirectDemoServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String redirect = request.getParameter("redirect"); if ("true".equals(redirect)) { System.out.println("Redirect to ShowMeServlet"); String contextPath = request.getContextPath(); response.sendRedirect(contextPath + "/showMe"); return; } ServletOutputStream out = response.getOutputStream(); out.println("- servletPath=" + request.getServletPath()); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }

Chạy lại webserver và truy cập lần lượt 2 đường dẫn sau lên trình duyệt:

Với đường dẫn thứ nhất nhận được:

Với đường dẫn thứ 2, request đã chuyển hướng sang ShowMeServlet, đường dẫn URL bạn thấy trên trình duyệt là đường dẫn của servlet ShowMeServlet.

Jsp — Requestdispatcher.forward () So Với Httpservletresponse.sendredirect ()

Trong thế giới phát triển web, thuật ngữ “chuyển hướng” là hành động gửi cho khách hàng một phản hồi HTTP trống chỉ với một tiêu đề Location chứa URL mới mà khách hàng phải gửi yêu cầu GET hoàn toàn mới. Nên về cơ bản:

Khách hàng gửi yêu cầu HTTP đến _some.jsp_.

Máy chủ gửi phản hồi HTTP trở lại với tiêu đề _Location: chúng tôi hàng gửi yêu cầu HTTP đến _other.jsp_ (điều này được phản ánh trên thanh địa chỉ trình duyệt!)

Máy chủ gửi phản hồi HTTP trở lại với nội dung _other.jsp_.

Bạn có thể theo dõi nó với bộ công cụ dành cho nhà phát triển dựng sẵn/addon của trình duyệt web. Nhấn F12 trong Chrome/IE9/Fireorms và kiểm tra phần "Mạng" để xem.

Chính xác những điều trên đạt được bởi sendRedirect("other.jsp"). RequestDispatcher#forward() không gửi chuyển hướng. Thay vào đó, nó sử dụng nội dung của trang đích làm phản hồi HTTP.

Khách hàng gửi yêu cầu HTTP đến _some.jsp_.

Máy chủ gửi phản hồi HTTP trở lại với nội dung _other.jsp_.

Tuy nhiên, vì yêu cầu HTTP ban đầu là _some.jsp_, URL trong thanh địa chỉ trình duyệt vẫn không thay đổi.

RequestDispatcher cực kỳ hữu ích trong mô hình MVC và/hoặc khi bạn muốn ẩn JSP khỏi truy cập trực tiếp. Bạn có thể đặt JSP trong thư mục _/WEB-INF_ và sử dụng Servlet để điều khiển, tiền xử lý và xử lý hậu yêu cầu. Các tệp tin trong thư mục _/WEB-INF_ không thể truy cập trực tiếp bằng URL, nhưng Servlet có thể truy cập chúng bằng cách sử dụng RequestDispatcher#forward().

Ví dụ, bạn có thể có một tệp tin JSP trong _/WEB-INF/login.jsp_ và LoginServlet được ánh xạ trên một _url-pattern_ của _/login_. Khi bạn gọi _http://example.com/context/login_, thì doGet() của servlet sẽ được gọi. Bạn có thể làm bất kỳ trướcxử lý công cụ trong đó và cuối cùng chuyển tiếp yêu cầu như:

_request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); _

Bằng cách này, doPost() của servlet sẽ được gọi và bạn có thể thực hiện bất kỳ bài đăngxử lý công cụ trong đó (ví dụ: xác thực, logic nghiệp vụ, đăng nhập người dùng, v.v.).

Nếu có bất kỳ lỗi nào, thì thông thường bạn muốn chuyển tiếp yêu cầu quay lại cùng một trang và hiển thị các lỗi ở đó bên cạnh các trường nhập liệu, v.v. . Bạn có thể sử dụng RequestDispatcher cho việc này.

Nếu một POST thành công, thông thường bạn muốn chuyển hướng yêu cầu, để yêu cầu sẽ không được gửi lại khi người dùng làm mới yêu cầu (ví dụ: nhấn F5 hoặc điều hướng trở lại trong lịch sử).

_User user = userDAO.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); response.sendRedirect("home"); } else { request.setAttribute("error", "Unknown login, please try again."); request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } _

Do đó, một chuyển hướng hướng dẫn khách hàng thực hiện yêu cầu GET mới trên URL đã cho. Làm mới yêu cầu sau đó sẽ chỉ làm mới yêu cầu được chuyển hướng chứ không phải yêu cầu ban đầu. Điều này sẽ tránh "đệ trình kép" và nhầm lẫn và trải nghiệm người dùng xấu. Đây cũng được gọi là mẫu POST-Redirect-GET .

Tạo Ứng Dụng Theo Mô Hình Mvc Với Java/Jsp/Servlet

Trong hướng dẫn này chúng ta sẽ học cách tạo một ứng dụng MVC đơn giản bằng cách sử dụng java servlets và jsp.

MVC là gì?

MVC tức là Model– View– Controller là một mô hình tách biệt các mối quan tâm hữu ích.

Model đại diện cho đối tượng POJO, kết nối và tương tác với database để lấy dữ liệu.

View thể hiện đây là nơi người dùng có thể nhìn thấy được và dữ liệu được trình bày dưới dạng trực quan.Tại đây, View chỉ có nhiệm vụ hiển thị dữ liệu!

Controller hay nói cách khác là bộ điều khiển là thành phần chịu trách nhiệm truyền thông giữa Model và View.

Với mô hình trên, khi có một người dùng truy cập vào ứng dụng web.Tất nhiên sẽ về phía server sẽ nhận một request từ phía client. Lúc này Client à user theo mô hình trên. Ví dụ khi các bạn truy cập vào blog itphutran và đang đọc bài viết này, thì sẽ gửi một yêu cầu đến server xử lý. Controller lúc này sẽ nhận yêu cầu từ client, có thể tương tác với database (Model) nếu có,xử lý thuật toán và nghiệp vụ. Trong trường hợp có tương tác với cơ sở dữ liệu thì model thực hiện tương tác với database lấy đúng dữ liệu yêu cầu và trả lại cho controller.Controller lúc này lấy dữ liệu đó trả về lại cho chúng tôi lúc này có nhiệm vụ hiển thị dữ liệu và trình duyệt biên dịch.Lúc này các bạn có thể nhìn thấy bài viết này.

Tạo ứng dụng theo mô hình MVC

Chúng ta sẽ hiểu,cài đặt và làm phần này theo mô hình mvc trong java.Bằng cách tạo một ứng dụng đăng nhập mẫu sẽ hiển thị một thông báo tên người dùng chào mừng và nếu đăng nhập thất bại thì nó sẽ chuyển hướng đến trang báo lỗi. Đây là những gì chúng ta sẽ tạo ra.

Login.jsp: – sẽ nhập tên người dùng và mật khẩu

Success.jsp: – Nếu đăng nhập thành công, thì trang này sẽ được hiển thị

Error.jsp: – Nếu đăng nhập không thành công thì trang này sẽ được hiển thị.

LoginController.java: – Đây là phần điều khiển của ứng dụng liên lạc với mô hình

Authenticator.java: Có logic nghiệp vụ để xác thực

User.java: Lưu trữ tên người dùng và mật khẩu cho người dùng.

Điền vào các chi tiết như tên dự án, máy chủ. Nhập tên dự án của bạn là “MVCDemo”. Bạn sẽ nhận được cấu trúc thư mục sau cho dự án.

LoginController Authenticator.java User.java chúng tôi chúng tôi

và file web.xml

Bây giờ hãy thử và chạy ứng dụng :

Start server tomcat của bạn và nhấn url : http://localhost:8080/MVCDemo/login.jsp.

Bạn sẽ có thể xem trang này :

Để bạn đọc dễ hiểu hơn, hãy nhìn vào sơ đồ thể hiện bên dưới :

Đầu tiên, người dùng truy cập vào trang chúng tôi và điền vào dữ liệu và gửi biểu mẫu.

Trong LoginController , kiểm tra valid từ người dùng và thiết lập thông tin của người dùng.

Lợi thế đáng chú ý của mẫu mvc là:

MVC làm cho ứng dụng trở nên trong sáng, giúp lập trình viên phân tách ứng dụng thành ba lớp một cách rõ ràng. Điều này sẽ rất giúp ích cho việc phát triển những ứng dụng xét về mặt lâu dài cho việc bảo trì và nâng cấp hệ thống.

MVC hiện đang là mô hình lập trình tiên tiến bậc nhất hiện nay, điều mà các framework vẫn đang nổ lực để hướng tới sự đơn giản và yếu tố lâu dài cho người sử dụng.

khuyết điểm mô hình mvc là:

Mặc dù, MVC tỏ ra lợi thế hơn nhiều so với cách lập trình thông thường. Nhưng MVC luôn phải nạp, load những thư viện đồ sộ để xử lý dữ liệu. Chính điều này làm cho mô hình trở nên chậm chạp hơn nhiều so với việc code tay thuần túy.

MVC đòi hỏi người tiếp cận phải biết qua OOP, có kinh nghiệm tương đối cho việc thiết lập và xây dựng một ứng dụng hoàn chỉnh. Sẽ rất khó khăn nếu OOP của người sử dụng còn yếu.

MVC tận dụng mảng là thành phần chính cho việc truy xuất dữ liệu. Nhất là với việc sử dụng active record để viết ứng dụng. Chúng luôn cần người viết phải nắm vứng mô hình mảng đa chiều.

Hy vọng điều này sẽ giúp bạn làm thế nào để tạo ra ứng dụng MVC bằng cách sử dụng java servlets và jsp.Nếu cảm thấy có ích, bạn có thể share để mọi người cùng học tập và tìm hiểu.

Hướng Dẫn Lập Trình Đa Luồng Trong Java

Chúng ta cần 2 class tham gia vào ví dụ này.

HelloMain là một class thông thường có hàm main, nó là một luồng chính (main thread).

HelloThread là một class mở rộng từ class Thread. Nó được tạo và chạy kích hoạt chạy bên trong luồng chính và sẽ chạy song song với luồng chính.

package org.o7planning.tutorial.thread.hellothread; public class HelloMain { public static void main(String[] args) throws InterruptedException { int idx = 1; for (int i = 0; i < 2; i++) { System.out.println("Main thread running " + idx++); Thread.sleep(2101); } HelloThread helloThread = new HelloThread(); helloThread.start(); for (int i = 0; i < 3; i++) { System.out.println("Main thread running " + idx++); Thread.sleep(2101); } } } package org.o7planning.tutorial.thread.hellothread; public class HelloThread extends Thread { @Override public void run() { int index = 1; for (int i = 0; i < 10; i++) { System.out.println(" - HelloThread running " + index++); try { Thread.sleep(1030); } catch (InterruptedException e) { } } } }

Kết quả chạy class HelloMain:

Bạn cũng có thể tạo một thread từ một class thi hành interface Runnable. Xem ví dụ minh họa:

package org.o7planning.tutorial.thread.runnable; public class RunnableDemo implements Runnable { @Override public void run() { int idx = 1; for (int i = 0; i < 5; i++) { System.out.println("Hello from RunnableDemo " + idx++); try { Thread.sleep(2000); } catch (InterruptedException e) { } } } } package org.o7planning.tutorial.thread.runnable; public class RunnableTest { public static void main(String[] args) throws InterruptedException { System.out.println("Main thread running.."); Thread thread = new Thread(new RunnableDemo()); thread.start(); Thread.sleep(5000); System.out.println("Main thread stopped"); } }

4- Luồng Deamon (Deamon Thread)

Java chia thread làm 2 loại một loại thông thường và Deamon Thread. Chúng chỉ khác nhau ở cách thức ngừng hoạt động. Trong một chương trình các luồng thông thường và luồng Deamon chạy song song với nhau. Khi tất cả các luồng thông thường kết thúc, mọi luồng Deamon cũng sẽ bị kết thúc theo bất kể nó đang làm việc gì.

Sử dụng setDeamon(boolean) để sét đặt một luồng là Deamon hoặc không. Chú ý, bạn chỉ có thể gọi hàm setDeamon(boolean) khi thread chưa được chạy. Điều đó có nghĩa là khi thread đã chạy bạn không thể chuyển luồng từ non-deamon sang deamon và ngược lại.

Khi một luồng mới được tạo ra, nó được thừa hưởng đặc tính deamon từ luồng cha. Như vậy khi bạn tạo một luồng trong hàm main của 1 class nó vốn là luồng non-deamon, vì vậy thread tạo ra mặc định cũng là none-deamon. Như vậy nếu bạn tạo một luồng mới trong một luồng Deamon, mặc định nó cũng sẽ là Deamon.

Thread thread = new MyThread(); thread.setDeamon(true); thread.setDeamon(false);

Để dễ hiểu chúng ta xem ví dụ sau, chúng ta cần 3 class tham gia vào minh họa:

package org.o7planning.tutorial.thread.deamon; public class NoneDeamonThread extends Thread { @Override public void run() { int i = 0; while (i < 10) { System.out.println(" - Hello from None Deamon Thread " + i++); try { Thread.sleep(1000); } catch (InterruptedException e) { } } } } package org.o7planning.tutorial.thread.deamon; class DeamonThread extends Thread { @Override public void run() { int count = 0; while (true) { System.out.println("+ Hello from Deamon Thread " + count++); try { sleep(2000); } catch (InterruptedException e) { } } } } package org.o7planning.tutorial.thread.deamon; public class DaemonTest { public static void main(String[] args) { Thread deamonThread = new DeamonThread(); deamonThread.setDaemon(true); deamonThread.start(); new NoneDeamonThread().start(); try { Thread.sleep(5000); } catch (InterruptedException e) { } } }

Kết quả chạy class DeamonTest:

Luồng deamon thường dùng làm gì?

Một trong các luồng Deamon quan trọng của Java đó là luồng gom rác ( Garbage Collection Thread), nghĩa là gom các tài nguyên không còn sử dụng để giải phóng bộ nhớ. Khi tất cả các luồng người dùng không còn hoạt động nữa luồng gom rác cũng bị dừng theo.

Thread.join() là một method thông báo rằng hãy chờ thread này hoàn thành rồi thread cha mới được tiếp tục chạy.

public final void join() throws InterruptedException; public final synchronized void join(long millis) throws InterruptedException; public final synchronized void join(long millis, int nanos) throws InterruptedException;

Hãy xem một ví dụ minh họa:

package org.o7planning.tutorial.thread.join; public class JoinThread extends Thread { private String threadName; private int count; public JoinThread(String threadName, int count) { this.threadName = threadName; this.count = count; } @Override public void run() { for (int i = 1; i < count + 1; i++) { System.out.println("Hello from " + this.threadName + " " + i); try { Thread.sleep(2000); } catch (InterruptedException e) { } } } } package org.o7planning.tutorial.thread.join; public class JoinTest { public static void main(String[] args) throws InterruptedException { Thread joinThreadA = new JoinThread("A*", 2); Thread joinThreadB = new JoinThread("B*", 3); Thread noJoinThreadC = new JoinThread("C", 5); joinThreadA.start(); joinThreadB.start(); noJoinThreadC.start(); joinThreadA.join(); joinThreadB.join(); System.out.println("Hello from main thread..."); System.out.println("Thread A isLive? " + joinThreadA.isAlive()); System.out.println("Thread B isLive? " + joinThreadB.isAlive()); System.out.println("Thread C isLive? " + noJoinThreadC.isAlive()); } }

Kết quả chạy class JoinTest:

Ví dụ sử dụng join(long millis):

package org.o7planning.tutorial.thread.join; public class JoinTest2 { public static void main(String[] args) throws InterruptedException { Thread joinThreadA = new JoinThread("A*", 5); joinThreadA.start(); joinThreadA.join(5000); System.out.println("Main thread after 5000 milli second"); System.out.println("Hello from main thread..."); System.out.println("Thread A isLive? " + joinThreadA.isAlive()); } }

6- Xử lý ngoại lệ cho Thread

Phương thức Thread.setDefaultUncaughtExceptionHandler() thiết lập mặc định xử lý khi luồng đột ngột chấm dứt do một ngoại lệ còn tự do, mà không có xử lý khác đã được xác định cho luồng đó.

package org.o7planning.tutorial.thread.exception; import java.util.Random; public class ThreadExceptionDemo { public static class RunnableTest implements Runnable { @Override public void run() { System.out.println("Thread running .."); while (true) { Random r = new Random(); int i = r.nextInt(100); System.out.println("Next value " + i); try { Thread.sleep(2000); } catch (InterruptedException e) { } throw new RuntimeException("Have a problem..."); } } } } public static void main(String[] args) { Thread thread = new Thread(new RunnableTest()); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("#Thread: " + t); System.out.println("#Thread exception message: " + e.getMessage()); } }); thread.start(); } }

Về mặt lý thuyết, “yield” có nghĩa là để cho đi, từ bỏ, đầu hàng. Một luồng yield nói với máy ảo là nó sẵn sàng để cho các thread khác được sắp xếp ở vị trí của nó. Điều này cho thấy rằng nó không phải làm một cái gì đó quá quan trọng. Lưu ý rằng nó chỉ là một gợi ý, mặc dù, và không đảm bảo có hiệu lực ở tất cả.

yield() được định nghĩa như sau trong Thread.java

public static native void yield();

Như vậy phương thức yield() được sử dụng khi bạn bạn thấy rằng thread đó đang rảnh rỗi, nó không phải làm việc gì quan trọng, nên nó gợi ý hệ điều hành tạm thời nhường quyền ưu tiên cho các luồng khác.

package org.o7planning.tutorial.thread.yield; import java.util.Date; public class YieldThreadExample { private static Date importantEndTime; private static Date unImportantEndTime; public static void main(String[] args) { importantEndTime = new Date(); unImportantEndTime = new Date(); System.out.println("Create thread 1"); Thread importantThread = new ImportantThread(); importantThread.setPriority(Thread.MAX_PRIORITY); System.out.println("Create thread 2"); Thread unImportantThread = new UnImportantThread(); unImportantThread.setPriority(Thread.MIN_PRIORITY); unImportantThread.start(); importantThread.start(); } static class ImportantThread extends Thread { @Override public void run() { for (int i = 0; i < 100000; i++) { System.out.println("n Important work " + i); Thread.yield(); } importantEndTime = new Date(); printTime(); } } static class UnImportantThread extends Thread { @Override public void run() { for (int i = 0; i < 100000; i++) { System.out.println("n -- UnImportant work " + i); } unImportantEndTime = new Date(); printTime(); } } private static void printTime() { long interval = unImportantEndTime.getTime() - importantEndTime.getTime(); System.out.println("UnImportant Thread - Important Thread = " + interval + " milliseconds"); } }

Kết quả: thread có ưu tiên thấp hơn đã hoàn thành công việc trước 51 mili giây so với thread có ưu tiên cao hơn.

8- So sánh sleep() và wait()

Bạn đang xem bài viết Jsp] Lập Trình Java Servlet Cơ Bản P5: Forward (Chuyển Tiếp) Và Redirect (Chuyển Hướng) Servlet trên website Sansangdethanhcong.com. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!